22

Clojureでは、以下の3つの違いは何ですか。

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

二人目の行動が理解できません。

最初のものと3番目のものは、Lisp-1であるclojureでは同じであり、変数の評価と同じ名前の関数の評価を区別していないと思います。

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

ありがとう。

4

1 に答える 1

35

3 番目のケースに関しては、Common Lisp とは対照的に、Clojure には関数の名前空間がないため、関数の名前空間内のシンボルの値#'+として読み取ったり参照したりしません。代わりに、呼び出された として読み取り、参照します。を適用することは、 に保存されている値を適用することと同じです。(function +)+(var +)var+varvar

2 番目のケースでは、数値のペアに記号を繰り返し適用しています。これはたまたま有効です。シンボルをマップに適用することは、そのマップにインデックスを作成することと同じです。

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

2 番目の引数を指定すると、マップ内に一致するキーが見つからない場合にデフォルト値として使用されます。

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

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

user> ('+ 'foo 4)
4
user> ('+ {} 4)
4
user> ('+ 1 4)
4
于 2012-03-18T17:41:37.387 に答える