2012-07-27 70 views
3

使用Clojure的1.2,此代碼的工作Clojure的EVAL錯誤

(defn A [] (fn [a] (+ a 2))) 
(println ((A) 0)) 
(println (eval (list (A) 0))) 

但下面的代碼失敗在第三行

(defn A [b] (fn [a] (+ a b))) 
(println ((A 3) 0)) 
(println (eval (list (A 3) 0))) 

爲什麼?

+1

你有一個公關essing需要使用Clojure 1.2嗎? 1.4好多了?幸運的是,這個問題的答案是版本不可知的。 – 2012-07-27 23:50:29

回答

2

調用(list (A 3))返回一個列表的功能:

user> (list (A 3) 0) 
(#<user$A$fn__2934 [email protected]> 0) 

eval預計在列表中獲得一個符號,它是越來越它的自我功能。如果你引用調用(A 3),那麼你將得到的結果,你尋求這個代碼的

user> (println (eval (list '(A 3) 0))) 
3 
nil 

部分被調用eval前評估,然後eval正在評估休息。在引用的表格中使用seeval可能更常見,也許有一個術語或 有選擇地不引用(~)。

user> (eval '((A 3) 0)) 
3 

user> (def my-number 3) 
#'user/my-number 
user> (eval `((A ~my-number) 0)) 
3 

編輯:關於爲什麼零個ARGS工程和失敗,一個arg的那個問題:

看來,這兩種形式,如果你不保存他們的工作在瓦爾(即DEFN定義它們) ,而是手動內聯他們:

user> (def A (fn [b] (fn [a] (+ a b)))) 
#'user/A 
user> (eval (list (A 3) 0)) 
; Evaluation aborted. 
user> (eval (list (fn [b] (fn [a] (+ a b)) 3) 0)) 
3 
+0

謝謝。如果eval作爲列表中的第一個參數傳遞一個函數,爲什麼.toString被調用?另外,爲什麼第一個例子工作,即使它缺乏這樣的引用? – 2012-07-27 23:31:39

+0

我在.toString部分完全錯誤。我正在測試repl並打印中間階段並將其讀回(這產生了一個不同的錯誤) – 2012-07-28 00:10:17

+0

即時通訊仍在研究最後部分 – 2012-07-28 00:53:02