2012-03-18 13 views
20

clojureでは、私は以下の3つの違いが何かを知りたいと思います。Clojureでは、関数、引用された関数とシャープクォート関数の違い

(println (map + '(1 2 3) '(4 5 6))) 

(println (map '+ '(1 2 3) '(4 5 6))) 

(println (map #'+ '(1 2 3) '(4 5 6))) 

結果は、私が二番目の動作を理解することはできません

(5 7 9) 

(4 5 6) 

(5 7 9) 

です。

私はLisp-1 であるclojureで同じことを感じていますが、変数と同じ名前の関数の評価を区別しません。

これは基本的な質問かもしれませんが、十分な情報がないようです。教えて下さい。

ありがとうございました。

+2

これに加えて、クロージャーでは、リテラルシーケンスを引用符で囲まれたリストの代わりにベクトルで記述するのは慣用的です。 –

+0

ああ、そうだ。ありがとう、アレックス。 –

答えて

32

第三の場合について、Common Lispの、#'+とは対照的に(function +)として読み取らないとClojureの関数名前空間を持たないため、関数の名前空間におけるシンボル+の値を指します。代わりに(var +)と表示され、+と呼ばれるvarを参照します。 varを適用することは、varに格納されている値を適用することと同じです。

2番目のケースでは、数字のペアに記号を繰り返し適用しています。これは偶然にも有効です。マップにシンボルを適用すると、そのマップへのインデックスと同じです:あなたは二番目の引数を指定した場合

user> ('a {'a 1, 'b 2, 'c 3, '+ 4}) 
1 
user> ('+ {'a 1, 'b 2, 'c 3, '+ 4}) 
4 

、一致するキーがマップに見つからなかった場合のデフォルト値として使用されます。

user> ('+ {'a 1, 'b 2, 'c 3} 4) 
4 

+のシンボルは数字のペアに適用されます。数字はマップではないため、+をキーとして含まないため、2番目の引数がデフォルト値として返されます。不一致

user> ('+ 'foo 4) 
4 
user> ('+ {} 4) 
4 
user> ('+ 1 4) 
4 
+0

偉大な答え。直ちに明らかな行動の明確な説明。ありがとう。 – sw1nn

+0

ありがとう、マティアス。私は#が意味することを理解することができた。私はヴァールを気づかずに無視しましたが、今度はもっと深く理解することができました。私は2番目のコードの動作を理解することもできました。ありがとうございました。 –

関連する問題