パラメータ ⇒ 位置パラメータ* 、または 位置パラメータ* & restパラメータ
位置パラメータ ⇒ バインディングフォーム
restパラメータ ⇒ バインディングフォーム
名前 ⇒ シンボル
関数を定義します(fn)。Fnは、IFnインターフェースを実装する第一級オブジェクトです。IFn
インターフェースは、0〜20の範囲のアリティでオーバーロードされたinvoke()
関数を定義します。単一のfnオブジェクトは、1つ以上のinvokeメソッドを実装し、アリティでオーバーロードできます。オーバーロードの1つだけが、アンパサンドの後に単一のrestパラメータを指定することで可変長にすることができます。このような可変長エントリポイントは、位置パラメータを超える引数で呼び出されると、それらをシーケンスに収集し、restパラメータによってバインドまたはデストラクチャリングします。提供された引数が位置パラメータを超えない場合、restパラメータはnil
になります。
最初の形式は、単一のinvokeメソッドを持つfnを定義します。2番目は、1つ以上のオーバーロードされたinvokeメソッドを持つfnを定義します。オーバーロードのアリティは異なる必要があります。いずれの場合も、式の結果は単一のfnオブジェクトです。
式式は、パラメータが実際の引数にバインドされる環境でコンパイルされます。式は暗黙のdo
に囲まれています。名前シンボルが提供されている場合、関数オブジェクト自体に関数定義内でバインドされ、匿名関数でも自己呼び出しが可能になります。パラメータシンボルにメタデータタグが付いている場合、コンパイラはタグをクラス名に解決しようと試み、その後のバインディングへの参照でその型を想定します。
(def mult
(fn this
([] 1)
([x] x)
([x y] (* x y))
([x y & more]
(apply this (this x y) more))))
mult
などの名前付きfnは通常、上記のようなものに展開されるdefn
で定義されます。
fn(オーバーロード)は、関数の先頭に、パラメータの数(restパラメータが存在する場合を含む)に等しいアリティを持つ再帰ポイントを定義します。recur
を参照してください。
fnsは、Javaの`Callable`、`Runnable`、`Comparator`インターフェースを実装します。
関数は、実行時の事前条件と事後条件の指定をサポートします。