2016-11-01 11 views
3

私は別の関数を返す関数を持って、短所、そして-EVAL-FN:それから、Clojure関数は同じインラインコードとは異なる動作をしますか?

(defn cons-then-eval-fn [x] 
    (fn [& e] (cons x (eval e)))) 

、私は他がやって、この概念の2つのインスタンス、短所、そして-EVAL-FNを使用して1を定義します同じことが、インラインコードで:(私が期待するように)いくつかの引数を指定し

(def zero-a (cons-then-eval-fn 0)) 
(def zero-b (fn [& e] (cons 0 (eval e)))) 

、この2つの関数は同じように動作:

(zero-a) => (0) 
(zero-b) => (0) 
(zero-a identity []) => (0) 
(zero-b identity []) => (0) 

しかしTHESと私はさまざまな行動を見ています:

(zero-b zero-b identity []) => (0 0) 
(zero-a zero-a identity []) => 
    IllegalArgumentException No matching ctor found 

誰も私がなぜこれが起こるのか理解してもらえますか?

答えて

2

関数オブジェクトを評価してはいけません。 evalはシンボル、リストなどのためのもので、コンパイラに供給されるソースコードです。すでにコンパイルされた関数オブジェクトは、evalに対する無効な引数です。いくつかのケースでは動作し、他のものでは動作しません(具体的には、クロージャーが失敗し、キャプチャされたスコープのない関数では動作しますが、これは保証されません)。