2

式の先頭で#を使用し、途中で%を使用するclojureの構成の名前は何ですか?例えば

#(fn [a b] (% b a))

ドキュメントで検索してみましたが、それを定義する両方の文字が英数字ではないため、検索はあまり成功していません。

4

4 に答える 4

8

これは、無名関数宣言用のリーダーマクロです。リーダーマクロの包括的なリストについては、http://clojure.org/readerを参照してください。

たとえば、に#(* 5 %)変換され(fn [x] (* 5 x))ます。

あなたの例は、読書段階で(fn [op] (fn [a b] (op a b)))op私の選択したプレースホルダーです)に変換されます。

于 2012-04-07T14:30:55.613 に答える
6

それは(少なくとも)2つの場所に表示されます:

  1. その他の便利な関数とマクロの下(ただし、%1%2などについては言及されていません)。

  2. リーダー内(プログラムを解析します)-#テーブルルックアップを介してリーダーマクロにディスパッチします(注意深く調べる必要がありますが、これは%1などを記述します)

どちらの場合も、有用な名前はありません(実際には、「ディスパッチ」は暗黙の名前である可能性があります。2番目のリンクを参照してください)。より一般的には、「#」は、とりわけoctothorpと呼ばれます(ここチリでは、何らかの理由で「gato」(猫))。

(はい、%1%2は最初と2番目のパラメーターなどですが、%&は「rest」です。最初のパラメーターには%だけを使用できます。2番目のリンクを参照してください)。

PS他の誰もが言っているように、それは関数の省略形です。したがって(fn [a b] (+ a b))、と同等です#(+ %1 %2)

Clojure> (#(println % % %2) 1 2)
1 1 2
nil
Clojure> (#(apply println %&) 1 2 3)
1 2 3
nil
于 2012-04-07T14:32:28.813 に答える
2

#()構文は、無名関数の定義の省略形です。%記号は、取る引数の省略形として使用されます。

最初の引数は%。複数の引数の場合は%integer(つまり、%1%2)。シーケンスでラップされた残りの(未使用の)引数の%&。

=> (#(println % %2 %3 %&) 1 2 3 4 5)
1 2 3 (4 5)

マクロ展開を実行することで、どの関数が作成されるかを確認できます

#((\ %1 %2) * %2))
=> (macroexpand-1 '#((\ %1 %2) * %2))
(fn* [p1__744# p2__745#] ((\space p1__744# p2__745#) * p2__745#))

通常の言葉で、以下は同じです:

  #((\ %1 %2) * %2))
  (fn [p1 p2] ((\ p1 p2) * p2))

この例では、内部に新しい無名関数を含む無名関数が作成されることに注意してください。

于 2012-04-07T14:57:34.257 に答える
1

「#」はラムダ文字である必要があり、%は予期される最初の引数を表します

于 2012-04-07T14:33:58.983 に答える