2012-04-07 5 views
2

中間の式%の先頭に#を使用するclojureの構文の名前は何ですか?たとえば、clojureの#と%の名前は何ですか?

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

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

答えて

8

匿名関数宣言のための読者マクロです。リーダーマクロの包括的な一覧については、http://clojure.org/readerを参照してください。

たとえば、#(* 5 %)(fn [x] (* 5 x))に変換されます。 (。opがプレースホルダの私の選択である)

あなたの例では、

6

それは(少なくとも)2つの場所で表示されます(fn [op] (fn [a b] (op a b)))に位相を読んで翻訳:Other Useful Functions and Macrosの下

  1. (それが」doesnの%1%2などを挙げてください)。 (プログラムを解析)Reader

  2. - #原因は、テーブルルックアップを経由してリーダーマクロに派遣(あなたは慎重に見ているが、これはなど%1を説明しています)

でもありませんケースには便利な名前があります(実際には、「ディスパッチ」は暗黙の名前です - 第2リンクを参照)。より一般的には、 "#"はoctothorpと呼ばれています(これはチリでは何らかの未知の理由で "gato"(cat)です)。

(もちろん、%1%2は最初のパラメータと2番目のパラメータなどですが、%&は "休憩"です - 最初の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 
+0

%1と%2は複数のパラメータを表しますか? –

+0

%1および%2はそれぞれ第1および第2のパラメータを表します。 – user100464

1

「#」ラムダ文字、および%でなければなりません#()建設は、匿名関数の定義の省略形です

2

を期待最初の引数を表します。 %記号は引数の省略形として使用されます。

%(最初の引数)。複数の引数の%整数(つまり%1%2)。残りの(使用されていない)引数はシーケンスでラップされた%&です。

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

はあなたの例に注意するように注意してください:

=> (#(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#)) 

をmacroexpandはをすることによって、それが作成する関数かを見ることができますその内部に新しい無名関数を持つ無名関数を作成します。

関連する問題