2016-11-01 3 views
3

내가 다른 함수를 반환하는 기능을 가지고, 죄수 당시 평가는-fn을 : 그에서Clojure 함수는 동일한 인라인 코드와 다르게 동작합니까?

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

, 내가 하나를 사용하여 단점 - 다음 - 평가 - fn을가, 다른 일을이 개념의 두 인스턴스를 정의 일부 인수가

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

,이 두 가지 기능은 (내가 기대하는 것처럼) 동일하게 작동 : 인라인 코드로하지만, 같은 일

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

그러나 살전와 나는 다른 행동을 보았습니다.

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

아무도 이런 일이 일어나는 이유를 이해할 수 있도록 도와 줄 수 있습니까?

답변

2

함수 개체를 평가하면 안됩니다. eval은 기호, 목록 등에 대한 것입니다. 컴파일러에 공급할 소스 코드입니다. 이미 컴파일 된 함수 객체는 eval에 대한 잘못된 인수입니다. 어떤 경우에는 작동하지만 다른 곳에서는 작동하지 않습니다 (특히 클로저의 경우 실패하고 캡처 된 범위가없는 함수의 경우 작동하지만 이것이 보장되지는 않음).

관련 문제