Clojure:在另一个命名空间中定义符号 上下文

Clojure:在另一个命名空间中定义符号 上下文,clojure,Clojure,这是init.clj的内容 (ns init) (defn get-hotswap [] (filter #(= (ns-name %) 'hotswap) (all-ns))) (let [x (get-hotswap)] (let [old-ns *ns*] (if (empty? x) (do (create-ns 'hotswap) (in-ns 'hotswap) (def global-kv-store

这是init.clj的内容

(ns init)

(defn get-hotswap []
  (filter #(= (ns-name %) 'hotswap) (all-ns)))

(let [x (get-hotswap)]
  (let [old-ns *ns*]
    (if (empty? x)
      (do
        (create-ns 'hotswap)
        (in-ns 'hotswap)
        (def global-kv-store (clojure.core/atom {}))
        (in-ns (ns-name old-ns)))
      (println "Found Hotswap"))))
现在。热交换/全局kv存储不存在,但存在初始/全局kv存储

问题: 我该如何解决这个问题?我希望能够

  • 创建新的命名空间热交换
  • 然后在其中定义一个新的变量全局存储
谢谢

您可以尝试以下方法:

(if-not (find-ns 'hotswap)
  (intern (create-ns 'hotswap) 'global-kv-store (atom {})))
您可以尝试以下方法:

(if-not (find-ns 'hotswap)
  (intern (create-ns 'hotswap) 'global-kv-store (atom {})))

实习生,不是ns/def,是我想要的。谢谢顺便说一句,纯粹为了学习,你能解释一下为什么在ns/def中不起作用吗?直觉地,我切换到“热交换名称空间”,然后在其中定义一些东西。。。我做错了什么?@user1311390我不确定。我认为问题在于,
*ns*
的值是从编译时(即init名称空间)获取的,而不是从运行时获取的。再次强调,不要把这当作一个明确的答案,因为它可能是完全错误的。实习生,不是ns/def,是我想要的。谢谢顺便说一句,纯粹为了学习,你能解释一下为什么在ns/def中不起作用吗?直觉地,我切换到“热交换名称空间”,然后在其中定义一些东西。。。我做错了什么?@user1311390我不确定。我认为问题在于,
*ns*
的值是从编译时(即init名称空间)获取的,而不是从运行时获取的。同样,不要把这当作一个明确的答案,因为它可能是完全错误的。