2012-07-27 71 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