高效的Clojure工作流程?

时间:2010-06-06 12:27:27

标签: clojure

我正在与Clojure开发一个宠物项目,但我想知道我是否可以加快我的工作流程。

我目前的工作流程(使用Compojure)是:

  1. 使用lein swank启动Swank。
  2. 转到Emacs,与M-x slime-connect联系。
  3. 逐个加载所有现有的源文件。这也启动了Jetty服务器和应用程序。
  4. 在REPL中写一些代码。
  5. 如果对实验感到满意,请写一个我想到的构造的完整版本。 Eval(C-c C-c)it。
  6. 将REPL切换到此构造所在的命名空间并对其进行测试。
  7. 切换到浏览器并使用受影响的页面重新加载浏览器标签。
  8. 调整代码,评估代码,检查浏览器。
  9. 重复以上任何一项。
  10. 有许多烦恼:

    1. 我必须一直在Emacs和浏览器之间切换(或浏览器,如果我正在使用多个浏览器进行模板测试)。有一个共同的习惯用于自动化吗?我以前有一个JavaScript位可以连续重新加载页面,但是当我必须与页面交互超过几秒钟时,它的实用性有限。
    2. 当我试验和编写测试函数时,我的JVM实例变得“脏”。基本上命名空间会受到污染,特别是如果我在名称空间之间重构和移动函数。这可能导致符号冲突,我需要重新启动Swank。我可以取消一个符号吗?
    3. 重启Swank后,我逐个加载所有源文件(C-c C-k)。我怀疑我做错了。
    4. 在REPL和文件编辑器之间切换可能会有点恼人,尤其是当我打开很多Emacs标签时,浏览器旁边。
    5. 我正在寻找改善上述观点和整个工作流程的方法,所以如果你愿意分享你的话,我会很感激。

      P上。 S上。

      之前我也使用过Vimclojure,因此也欢迎基于Vimclojure的工作流程。

2 个答案:

答案 0 :(得分:19)

不完整的工作流程描述,只是一些想法:

  1. 可以使用ns-unmap函数从名称空间中删除Var。为了方便起见,可以在其上构建undef宏,例如像这样:

    (defmacro undef [& syms]
      `(do ~@(map (fn [s] `(ns-unmap *ns* '~s)) syms)))
    

    ns-unalias也可能是有意义的。

  2. 没有理由在每个文件夹中执行 C-c C-k 来查看包含名称空间的文件;您只需require REPL所需的命名空间。

    此外,如果您在SLIME REPL中键入几个字符然后使用 Mp / Mn 来浏览历史记录,则只输入与您输入的文本的初始位匹配的条目将显示手动。这与Paredit兼容(尾随的结束支架不会有问题)。所以,如果你在开始时建立一个巨大的需求 - (require '[foo :as f] '[bar :as b] '[clojure.contrib.sql :as sql] ...) - 那么在重新启动Swank之后,你需要做的就是键入类似(require '[f的内容并按 Mp 再次将该表单带到REPL提示符。

    不可否认,这可以通过多种方式实现自动化(例如,让Swank REPL搜索配置文件,或者将一个简单的宏扩展为适当的require形式,只需引入一个来自项目的实用程序命名空间 - 特别是后一种想法很容易实现),但我发现它在烦恼因素上足够低,到目前为止我还没有任何改进。

  3. 当您处于启用SLIME的缓冲区时,可以使用 C-c C-z 创建一个带有SLIME REPL的窗口。此外,如果您还没有,请尝试使用ido。我倾向于使用在屏幕左侧的窗口中打开的代码缓冲区和右侧的REPL缓冲区;与windmove-leftwindmove-right绑定一些方便的键,我往往很高兴。如果我需要经常查看其他缓冲区,我会使用额外的Emacs帧。

  4. 顺便说一句,我通常不使用lein swank,我更喜欢我的自定义clojure-project功能(Phil Hagelberg原创的调整版)。有时,我觉得有希望改进它...也许我会在下次发生时处理每个项目import / require自动化。 ; - )

答案 1 :(得分:5)

我不确定Lein,但在Maven中你可以指定repl脚本的名称(replScript config param),它允许指定在REPL&的启动时执行哪些命令。 Swank ...如果您的项目有单独的命名空间,您可以使用clojure.contrib.find-namespaces中的函数来查找您的命名空间并加载它们....