【问题标题】:clojure symbol resolve failure in eval [duplicate]clojure 符号解决 eval 中的失败 [重复]
【发布时间】:2020-02-27 07:40:36
【问题描述】:

我是 clojure 的初学者。 你能帮忙解决最后两个表达式吗? 我无法弄清楚为什么“无法解析符号:导致这种情况”。 非常感谢! (我正在尝试解决列表中存在引用的问题。)

(let [result ['(get result 1) 2]]
  (println (get result 1))          ;this can work
  (println (eval '(get result 1)))  ;error
  (println (eval(first result))))   ;error`

我希望(map eval result) 产生[2 2]

【问题讨论】:

    标签: clojure


    【解决方案1】:

    eval 评估您在绑定到 *ns* 但词法范围为空白的命名空间中发送的表单。所以周围的 let 值不会被结转。然而,定义的变量、动态绑定等将在那里。这个帖子很好解释Variable scope + eval in Clojure

    顺便说一句,eval 对于初学者来说是一种非常强大且令人困惑的酒。在 6-7 年的 clojure 编程中,我从来不需要它。

    【讨论】:

    • 您好,感谢您的帮助!有没有更好的方法来处理这个问题:[(+ 1 2nd) 0 (- 1st 3) (* 3rd 1st)] (nth 表示 vec 内的第 n 个元素)
    • eval 不以空白命名空间开头。它在调用 eval 的命名空间的上下文中进行评估
    • 你是对的,它以一个空白的词法范围开始。谢谢
    • 解释它的一种方式是,好像表达式已作为顶级表单输入到文件中。
    • @ArthurUlfeldt 也不完全是这样。它在*ns* 的上下文中进行评估。在一个交互式的repl中,这是您定义的命名空间,但在非交互式程序*ns*通常是,我认为,user。您可以通过运行类似(def x 1) (defn -main [] (println (eval '*ns*)) (println (eval 'x))) 的程序看到这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多