Clojure评估错误

时间:2012-07-27 23:15:58

标签: clojure

使用Clojure 1.2,此代码可以正常工作

(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 个答案:

答案 0 :(得分:2)

调用(list (A 3))会返回列表中的函数:

user> (list (A 3) 0)
(#<user$A$fn__2934 user$A$fn__2934@2f09b4cb> 0)

eval期望在列表中得到一个符号,它正在获得它自己的功能。如果您引用(A 3)的电话,那么您将获得您寻求的结果

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

在调用eval之前评估部分代码,然后eval正在评估其余代码。在引用的表格中使用的seval更常见,可能是一个术语或 有选择地不加引号(~)。

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