gpt4 book ai didi

Clojure 评估错误

转载 作者:行者123 更新时间:2023-12-02 17:03:17 24 4
gpt4 key购买 nike

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

为什么?

最佳答案

调用(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 评估其余部分。更常见的是,se eval 用于引用形式,可能带有术语或有选择地取消引用 (~)。

user> (eval '((A 3) 0))
3

user> (def my-number 3)
#'user/my-number
user> (eval `((A ~my-number) 0))
3

编辑:关于为什么它可以使用零参数而使用一个参数失败的问题:

如果你不将它们存储在 vars 中(即用 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

关于Clojure 评估错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11696797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com