繁体   English   中英

如何在苹果酒模式下清除REPL?

[英]How to clear the REPL in cider-mode?

我不是要清理REPL的文本输出; 我的意思是清理REPL中的所有评估结果。 在开发过程中,反复的Cc CqCc Mj效率低。


UPDATE

我的调试行为可能有些不好。 我不确定其他人如何用CIDER开发prog,但我真的需要上面提到的功能。 我猜其他开发人员也会遇到与我相同的问题。

例如,在clojure prog单元的顶部,我使用declare来声明一个函数foo ,它被另一个函数bar ,而foo是在bar之后实现的。 然后,我Cc Ck等,编程进展顺利。 后来,我偶尔删除了foo的前向声明。 怎么了? 编程仍然顺利。 真的吗? 然后,我完成整个工作并愉快地终止CIDER REPL会话。

早上的灾难:没有找到符号foo

那是我的故事。 那么,没有人遇到类似的问题?

尝试clojure.tools.namespace.repl命名空间中的(refresh)函数:

刷新函数将扫描类路径上Clojure源文件的所有目录,读取其ns声明,构建其依赖关系图,并按依赖顺序加载它们。

https://github.com/clojure/tools.namespace#reloading-code-usage

它似乎没有删除在user命名空间中声明的变量,我已经在REPL中输入,但它确实:

...卸载(删除)更改的名称空间以清除任何旧定义。

我们通常会在user命名空间中添加一些其他有用的东西,因此它会在启动时加载到REPL中:

(ns user
  (:require [clojure.tools.namespace.repl :refer [refresh]]
            [clojure.repl :refer [doc source]]
            [clojure.pprint :refer [pprint pp]]
            [midje.repl :as midje]
            [clojure.stacktrace :as st]))

要将该代码与main和test源分开,请将其放在<project root>/dev/user.clj的文件中,然后将以下内容添加到lein project.clj文件中:

:profiles {:dev {:source-paths ["dev"]}}

(ps虽然这不是你想要回答的问题,对于那些看到这个答案并希望清除Cider REPL中文本的人来说,它是Cc Mohttps://github.com/clojure-emacs/cider

像其他人已经指出的那样,“正确”的解决方案是使用Stuart Sierra的组件库。

但是,由于您在CIDER中运行,您可以使用Cc Cx来运行cider-refresh ,这将重新加载您的项目,从而重新创建您的初始状态。

在EMACS中,当我在苹果酒模式下使用Clojure时,我使用:

在repl缓冲区中的Cc Mo.

它与cider-repl-clear-buffer绑定

如果您正在处理大量具有您想要清除的状态以具有干净的开发环境的事物,您可以考虑执行以下操作之一:

1.)重新评估您的设计,看看实际需要多少状态。 在许多情况下,您可能会不必要地使用原子,引用或其他有状态项目,如果采用更具功能性的方法,您将不会发现自己需要经常清理开发环境。

假定使用州的合法理由:

2.)您可以使用clojure函数remove-ns来清除命名空间及其所有内容:例如,对于名为user.fancy-namespace您可以通过运行(remove-ns 'user.fancy-namespace') NS (remove-ns 'user.fancy-namespace')然后只需重新评估命名空间。 这适用于清理单个命名空间,但如果需要清理的有状态项位于其他命名空间中,则对于涉及的每个命名空间执行此操作会非常繁琐。

3.)Stuart Sierra的组件库旨在管理涉及国家的组件。 对于管理数据库连接,内存缓存客户端等非常有用,但需要对项目进行重新架构才能充分利用它。

正如其他人所提到的,只有在你拥有保存状态信息的变量时才需要清除repl。 对于非状态承载组件,只需重新加载源缓冲区(重新评估它)就足够了。

管理具有跟踪状态的组件的工作流的一种非常有趣的方式是Stuart Seirra的组件框架。 http://youtu.be/13cmHf_kt-Q

另一种方法是使用defonce而不是def来编写代码,这将允许您重新加载源代码而无需重新定义状态变量。

如果另一方面,你想这样做来清理defn或defmacro定义,你不需要从你的repl中清除'polution',那么说实话,我不会打扰。 如果没有什么东西可以调用defn或macro,那真的没关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM