在emacs中重新加载Clojure文件

Lew*_*ubb 5 windows clojure clojurebox

我刚刚开始学习Clojure和Emacs.我有运行Windows的Clojure Box,我希望能够在缓冲区中编写代码然后在REPL中运行它而无需调用

(use 'example.code)
Run Code Online (Sandbox Code Playgroud)

每时每刻.我知道Cc Ck但它没有重新加载命名空间.如果我使用

(in-ns 'example.code)
Run Code Online (Sandbox Code Playgroud)

更改它运行的repl中的命名空间.这样做的正确方法是什么?

Mic*_*zyk 10

in-ns 是正确的方法之一.

对我来说最"正确"的方式是在REPL (require '[example.code :as ec])user命名空间中工作; 就这样,我的一次性实验状态保持不变user并且ec/foo对我来说非常方便(并且它显然foo应该来自哪里).您可以随时说(require :reload-all 'example.code)(同样适用use)强制重新编译.

此外,这是一个从当前命名空间中删除从给定命名空间中引入的所有映射的函数use:

(defn unuse [ns]
  (doseq [[n v] (ns-refers *ns*)]
    (if (= (.. v ns name) ns)
      (ns-unmap *ns* n))))
Run Code Online (Sandbox Code Playgroud)

最重要的是你可以建立

(defn reuse [ns]
  (unuse ns)
  (remove-ns ns)
  (use :reload-all ns))
Run Code Online (Sandbox Code Playgroud)

并说(reuse 'example.code)你的命名空间接近一个新的开始.(注意1.2新功能,例如deftypedefrecord引入一些复杂性......特别是unuseimported类没有影响- 这包括记录和deftype创建的类型.:reload-all仍然会导致deftype等等形式被重新编译,但我记得很奇怪这似乎不够的情况......可能是我的错误,可能是这些功能的一些神秘方面,我还没有完全探索过.)