gpt4 book ai didi

clojure - 为什么我不能使用 Clojure 在 do 中声明命名空间和方法

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

我尝试在 clojure 中编写一个宏来设置命名空间并自动向其中添加一些方法。我的宏不起作用,我将其追踪到 do 语句。不可能在 do 中声明一个新的命名空间,然后立即在该命名空间中声明一个方法。为什么?

这不起作用:

(ns xyz)
(do
(ns abc)
(prn *ns*)
(defn tst[] (prn "test" *ns*)))

(prn "after" *ns*)
(tst)

这有效(do 之前的命名空间声明):

(ns xyz)
(ns abc)
(do
(prn *ns*)
(defn tst[] (prn "test" *ns*)))

(prn "after" *ns*)
(tst)

感谢您的阅读, 马库斯

最佳答案

实际上,您的代码恰好可以与 Clojure >1.0 配合使用,但不要依赖它!每个顶级表单都会被编译然后执行:

(ns xyz) ; compiled with current ns / exec sets the current ns to xyz
(do ; the whole form is compiled inthe current ns (xyz) so it defines xyz/tst
(ns abc)
(prn *ns*)
(defn tst[] (prn "test" *ns*)))
; the form above is executed: it sets the new current ns
; and the value for xyz/tst

(prn "after" *ns*) ; we are in abc
(tst) ; abc/tst doesn't exists

在 clojure > 1.0 中,顶层的 a do a 被“展开”,因此您的代码现在相当于:

(ns xyz)
; (do
(ns abc)
(prn *ns*)
(defn tst[] (prn "test" *ns*));)

(prn "after" *ns*)
(tst)

关于clojure - 为什么我不能使用 Clojure 在 do 中声明命名空间和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1330326/

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