高效的Clojure工作流程?

Ale*_*x B 28 clojure

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

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

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

它有很多烦恼:

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

我正在寻找改善上述要点和整个工作流程的方法,所以如果你愿意分享你的话,我会很感激.

PS

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

Mic*_*zyk 19

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

  1. 可以使用该ns-unmap函数从命名空间中删除Var .为了增加便利性,undef可以在其上构建宏,例如:

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

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

  2. 没有理由C-c C-k在每个文件夹中查看包含命名空间的文件; 您可以require在REPL中找到所需的命名空间.

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

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

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

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


Ale*_*Ott 5

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