gpt4 book ai didi

clojure - 如何解决let中的interned变量?

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

以下代码可以正常编译:

(intern *ns* 'a 1) ;#'user/a
(intern *ns* 'b (+ a 1)) ;#'user/b

它也可以在 do 中编译:

(do
(intern *ns* 'c 1)
(intern *ns* 'd (+ c 1)))

但是在 let(或我尝试过的任何其他绑定(bind)形式,包括 fn)中编译失败:

(let []
(intern *ns* 'e 1)
(intern *ns* 'f (+ e 1)))
;CompilerException java.lang.RuntimeException: Unable to resolve symbol: ‘e in this context, compiling:(NO_SOURCE_PATH:2:5)

在这种情况下,实习生似乎要等到 let 完成后才会执行。我唯一的解决方法是改变原子或使用 alter-var-root

为什么intern不能在let等内部工作。与 do 中的方式相同吗?有没有办法强制实习生在 let 内完成,以便上面的示例可以编译? (顺便说一句,宏不是一个选项,因为我想使用 ns-map 访问绑定(bind)表单中的运行时信息)

最佳答案

你不能这么写,因为只有 do 得到特殊处理,导致其子表单按顺序编译和评估,而不是一次全部编译然后全部评估。但实际上,这是一种奇怪的方式来完成您想要做的事情:这些对 intern 的手动调用非常不寻常。为什么不简单地将本地变量放入 let 中,然后实习你想要保留的那些变量呢? let 正是您需要的属性,因为先前定义的符号在下一个绑定(bind)中可见。

(let [e 1, f (+ e 1)]
(intern *ns* 'e e)
(intern *ns* 'f f))

关于clojure - 如何解决let中的interned变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28389989/

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