私は clojure koans に取り組んでおり、関数の質問の 1 つは、「それを理解する」ためにさらに説明する必要があります。質問を満たす関数を書くことができます。しかし、すべてのビットが機能する理由が完全にはわかりません。
Clojure> (= 25 ((fn [a b] (b a)) 5 (fn [n] (* n n))))
true
質問 1. なぜエラーが発生するのかわかりません:
Clojure> (= 25 ((fn [b a] (b a)) 5 (fn [n] (* n n))))
java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn
したがって、上記の唯一の変更点は、b と a の順序を入れ替えることです。私の脳内では「a と b を取る関数」または「b と a」を読みますが、それらがどのように使用されるかはその後の括弧内のステートメントに依存します。なぜこの時点で順序が重要なのですか?
質問 2。
Clojure> (= 25 ((fn [a] (5 a)) (fn [n] (* n n))))
java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn
b が表す int の値を b の値に置き換えると、エラーが発生するのはなぜですか?
質問 3。
((fn [a b] (b a)) 5 (fn [n] (* n n))))
これがエラー (ba) をスローしないのはなぜですか b この場合、シンボルである 5 です。括弧内の最初の項目は、リストでない限り、関数または特別な形式であると予想されますか?