使用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)))
为什么?
答案 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