使用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)))
爲什麼?
使用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)))
爲什麼?
調用(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
謝謝。如果eval作爲列表中的第一個參數傳遞一個函數,爲什麼.toString被調用?另外,爲什麼第一個例子工作,即使它缺乏這樣的引用? – 2012-07-27 23:31:39
我在.toString部分完全錯誤。我正在測試repl並打印中間階段並將其讀回(這產生了一個不同的錯誤) – 2012-07-28 00:10:17
即時通訊仍在研究最後部分 – 2012-07-28 00:53:02
你有一個公關essing需要使用Clojure 1.2嗎? 1.4好多了?幸運的是,這個問題的答案是版本不可知的。 – 2012-07-27 23:50:29