【问题标题】:Efficient Clojure workflow?高效的 Clojure 工作流程?
【发布时间】:2010-06-06 12:27:27
【问题描述】:

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

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

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

它有很多烦恼:

  1. 我必须一直在 Emacs 和浏览器(或浏览器,如果我正在测试诸如使用多个浏览器进行模板化之类的东西)之间切换。是否有一个常见的习惯用法可以自动执行此操作?我曾经有一个不断重新加载页面的 JavaScript 位,但显然,当我必须与页面交互超过几秒钟时,它的实用性有限。
  2. 当我试验和编写测试函数时,我的 JVM 实例变得“脏”。基本上命名空间会被污染,尤其是当我在命名空间之间重构和移动函数时。这可能导致符号冲突,我需要重新启动 Swank。我可以取消定义符号吗?
  3. 我在重新启动 Swank 时一一加载所有源文件 (C-c C-k)。我怀疑我做错了。
  4. 在 REPL 和文件编辑器之间切换可能有点烦人,尤其是当我在浏览器旁边打开了很多 Emacs 选项卡时。​​li>

我正在寻找改进上述要点和整个工作流程的方法,如果你能分享你的,我将不胜感激。

P。 S.

我之前也用过 Vimclojure,所以也欢迎基于 Vimclojure 的工作流程。

【问题讨论】:

    标签: clojure


    【解决方案1】:

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

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

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

      ns-unalias 也可能感兴趣。

    2. 没有理由只为了在每个文件中执行 C-c C-k 而遍历包含命名空间的文件;你可以在 REPL 中 require 你需要的命名空间。

      此外,如果您在 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. 您可以在启用 SLIME 的缓冲区中使用 C-c C-z 制作一个弹出 SLIME REPL 的窗口。此外,如果您还没有使用ido,您应该尝试使用。我倾向于使用在屏幕左侧的窗口中打开的代码缓冲区和右侧的 REPL 缓冲区。 windmove-leftwindmove-right 绑定到一些方便的键,我往往会很高兴。如果我需要经常查看额外的缓冲区,我会使用额外的 Emacs 帧。

    4. 顺便说一句,我通常不使用lein swank,我更喜欢我的自定义clojure-project 函数(Phil Hagelberg 原版的调整版)。有时,我想改进它……也许下次发生这种情况时,我会处理每个项目的import / require 自动化。 ;-)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-10-16
        • 1970-01-01
        • 2015-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 2017-06-08
        相关资源
        最近更新 更多