gpt4 book ai didi

Clojure 中的动态 let ?

转载 作者:行者123 更新时间:2023-12-01 18:43:23 25 4
gpt4 key购买 nike

我在 REPL 中发生了以下情况:

mathematics.core> (let [zebra 1] (resolve 'zebra))
nil
mathematics.core> (def zebra 1)
#'mathematics.core/zebra
mathematics.core> (let [zebra 2] (when (resolve 'zebra) (eval 'zebra)))
1

基本上,我想使用诸如 let 表单之类的东西动态地将值绑定(bind)到变量,并且让该表单内的函数能够访问变量绑定(bind)到的值。

mathematics.core> (def ^:dynamic zebra 1)
#'mathematics.core/zebra
mathematics.core> (binding [zebra 2] (when (resolve 'zebra) (eval 'zebra)))
2

binding 似乎可以达到我想要的效果,但据我所知,它需要首先使用 :dynamic 元数据定义一个变量。我希望能够即时使用以前从未定义过的变量,并且让表单中的表达式能够访问该变量,就好像它已实际定义一样。

为了说明这一点,我想要这样的东西:

mathematics.core> (let-dynamic [undefined-variable 1]
(when (resolve 'undefined-variable) (eval 'unresolved-variable)))
1

有没有简单的方法可以做到这一点?或者使用宏来完成此任务的方法?

最佳答案

这不会特别有效。如果未定义该符号,则 Clojure 编译器无法编译任何使用它的代码。您也许可以使用在需要时延迟调用 def 的宏进行某种破解,但这将是一些非常令人讨厌的代码......

我建议只使用绑定(bind),并提前定义你的变量。您应该能够按照这种方式编写代码。

我认为“动态”定义变量是一个坏主意。我认为你不应该真正需要这个 - 如果你在代码中使用变量,那么只需为每个变量事先执行 (def ^:dynamic ...) 就足够简单了您使用的变量?

关于Clojure 中的动态 let ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8938398/

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