【问题标题】:clojure REPL doesn't pick up changes made to defrecordclojure REPL 不会获取对 defrecord 所做的更改
【发布时间】:2011-07-21 12:41:07
【问题描述】:

我设置了一个 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,但这不起作用。我已经尝试删除项目根目录中的“类”目录,但这也是不行的。

如果有任何见解或建议,我将不胜感激。

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

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

【问题讨论】:

  • 您能否从显示旧值的 repl 中粘贴一个 sn-p,更改它,然后更改新值。我认为这将有助于添加上下文,以便我们提供更多帮助
  • @Arthur:我应该更清楚地说明这一点。我正在更改 defrecord 中协议的实现,当我进行更改时,REPL 仍在使用旧实现 - 即使在创建记录的新实例之后也是如此。
  • 我只从 Common Lisp 知道 Slime/Swank。我很惊讶您不使用C-c C-c 来编译各个顶级表单。顺便说一句,有C-c ~可以将REPL的包和目录切换到当前文件和指向。
  • 你能从 repl 和协议定义的前后 sn-ps 中粘贴一个块吗?如果您无法透露来源,也许您可​​以为同样的问题制作一个人为的例子? ps:clojure是什么版本的

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


【解决方案1】:

我可以举一个例子,但也许您正在更改记录的定义并查看更改前的某些记录的实例?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2023-03-28
    • 2022-11-18
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多