clojure REPL不会获取对defrecord所做的更改

时间:2011-03-23 17:37:19

标签: clojure record read-eval-print-loop slime leiningen

我有一个leiningen项目。在其中一个clojure源文件中,我定义了一些记录。我的工作流程通常是启动emacs并连接到'lein swank'REPL。一旦我连接到REPL,我切换到相应的命名空间和C-c C-k文件,所以我可以开始使用REPL和文件中的代码。但是,如果我对该文件中的记录和C-c C-k进行更改,则REPL不会接收更改。

所以,就目前而言,每当我需要对记录进行更改时,我必须停止lein swank进程,重新启动它,并从emacs重新连接到它。这变得非常快。我错过了什么?我已经尝试过C-c C-l而不是C-c C-k,但这不起作用。我已经尝试删除项目根目录中的“class”目录,但这也是不行的。

我很感激任何见解或建议。

另外,另外,我总是在定义记录的命名空间中工作。

编辑:我实际上是在defrecord中更改协议的实现。一旦我更改它并使用C-c C-k进行编译,并在REPL中创建一条新记录,REPL仍然使用旧的协议实现。

1 个答案:

答案 0 :(得分:4)

我可以使用一个例子,但也许您正在更改记录的定义并查看某些记录的实例,这些记录是在更改之前所做的?

如果您从repl定义记录的实例,然后更改defrecord,重新加载repl,然后创建一个具有不同名称的新副本,您是否可以看到它们之间的副本和差异。

我尝试通过在我的项目中调用(use :reload-all ... all the namespaces in my project ...)的文件来避免这种混淆,然后我可以重新加载这个文件,并且reload-all抛出旧的var绑定等。