gpt4 book ai didi

Clojure的eval没有 "see"本地符号

转载 作者:行者123 更新时间:2023-12-02 21:01:06 26 4
gpt4 key购买 nike

我正在 Clojure 中尝试 eval:

(let [code_as_data '(if (< sequ) on_true on_false)
sequ [1 3 5]
on_true "sequence is sorted in ascending order"
on_false "sequence is NOT sorted"]
(eval code_as_data))

CompilerException java.lang.RuntimeException: Unable to resolve symbol: sequ in this context, compiling:(/tmp/form-init3253735970468294203.clj:1:25)

如何定义符号以便 eval“看到”它们?

最佳答案

向运行时由 eval 生成的代码提供本地数据的最简单方法是生成一个接受参数的表单。

(let [code-as-data '(fn [sequ on-true on-false]                                 
(if (apply < sequ)
on-true
on-false))
f (eval code-as-data)]
(f [1 3 5]
"sequence is sorted in ascending order"
"sequence is NOT sorted"))

当然,由于函数是将运行时值插入已知形式的标准方法,因此实际上根本不需要使用 eval。无需 eval 即可更简单地表达相同的功能:

(let [f (fn [sequ on-true on-false]                                             
(if (apply < sequ)
on-true
on-false))]
(f [1 3 5]
"sequence is sorted in ascending order"
"sequence is NOT sorted"))

在实际代码中,仅当需要在运行时生成逻辑时(例如,如果用户提供新算法),才需要 eval 版本。如果期望用户将代码编写为函数很麻烦,您可以采取折衷方案:

(defn code-with-context                                                         
[body sq t else]
(let [f (eval (list 'fn '[sequ on-true on-false] body))]
(f sq t else)))



(code-with-context (read-string "(if (apply < sequ) on-true on-false)")
[1 3 5]
"sequence is sorted in ascending order"
"sequence is NOT sorted")

关于Clojure的eval没有 "see"本地符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38183267/

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