使用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