【问题标题】:Clojure Development: IDE or REPL?Clojure 开发:IDE 还是 REPL?
【发布时间】:2010-12-09 07:30:40
【问题描述】:

我使用 Clojure 已经有一段时间了,想创建一些比玩具更大、更复杂的项目。过去几年我一直在使用 Java,并且已经习惯了 IDE 为我做的事情——编译大量类,将它们打包到 jar 中,创建批处理文件供用户启动它们。

当我查看 Clojure 中的开发示例时,它们似乎类似于将文件加载到 REPL 中,看看它们是如何工作的,编辑文件,重新加载,重复。在任何地方都不会生成类或 jar。例如,在 Stuart Halloway 出色的“Programming Clojure”中,我找不到“:gen-class”的单个示例。我使用的 Clojure IDE(ClojureBox 和 enclojure NetBeans 插件)似乎促进了相同的工作流程。

这是故意的吗?工具是否太不成熟,还是我只是不“明白”?

如果可能的话,我想听听一些创建了一些非平凡程序供普通用户(而不是其他开发人员)使用的人的工作流程示例。

感谢您分享您的意见。

【问题讨论】:

  • 如果您想将 jar 文件交付给最终用户,只需使用 'lein uberjar'。您仍然可以使用 REPL 来构建程序,但最终用户不必使用 REPL 来使用该程序。

标签: ide clojure read-eval-print-loop


【解决方案1】:

我认为这里真的有两个问题:

A) 如何部署(以及构建和管理依赖项)。我只能说看看其他具有相似目标/领域的项目并复制它们。

B) 工作流程:

我的工作流程是这样的:

  1. 打开一个文件并写一些高级的一厢情愿声明

  2. 开始编写一些函数来支持它

2.5 在我创建函数定义时将它们复制到 REPL

  1. 打开另一个文件并编写一些基本测试来检查功能是否正常

3.5 将这些复制到 REPL

  1. 在两个缓冲区之间迭代,将测试构建到一个示例和程序朝着最终目标。这些最终变成了类似的活动,我知道我已经完成了。

  2. 将辅助文件包裹在 deftest 中

现在当我一个月后回来时,我可以运行我的测试并且很开心!保存 REPL 缓冲区可以毫不费力地提供一些价值。这正是目前对我有用的方法,我很高兴接受教育以更好的方法。

至于 IDE 与 REPL 的选择 - 大多数 IDE 都有带有 REPL 的插件,所以我不确定它是一个还是另一个选择 - 实际上它只是关于你在哪个文本编辑器中高效,以及你想如何管理你的项目结构。没有任何“这样做”结构预制 AFAIK,因此此时查看特定项目(如 Clojure 本身、半影或组合或主站点上列出的任何库)更容易。

【讨论】:

  • 如果您的编辑器支持将代码发送到 REPL,那么您可以摆脱复制粘贴(Emacs、vim with vim-fireplace、lighttable)。
【解决方案2】:

长期以来,大多数 LISP 系列(和其他功能语言)IDE 都鼓励使用 REPL 开发方法。其中一些 REPL 还具有您可能与 Java IDE 相关联的自动完成功能。

与标准方法相比,REPL 为您提供了几个主要优势。首先是它允许您在程序运行时执行任意代码,这可以使调试多线程系统变得更加简单。其次,更重要的是,它可以让您在编写代码时轻松测试您的函数。您无需围绕新函数或新类构建框架,您可以直接在 REPL 中使用它,并查看它如何响应各种用例。

【讨论】:

    【解决方案3】:

    好吧,首先,几乎任何适用于任何编辑器或 IDE 的体面的开发插件都会为您提供一种在 IDE 中使用 Clojure REPL 的方法。甚至可能允许您将文件加载到 REPL 中进行测试等。您无需选择其中之一。

    Enclojure 正在走很长一段路,这是肯定的。然而,大多数人都对使用 Emacs 非常满意,包括我自己。 Emacs 使用 Lisp 作为其配置语言,因此它通常是 Lisper 最自然的选择。

    对于具有 REPL 的语言,使用 REPL 作为开发过程的主要部分是常态。编辑文件,将它们加载到 REPL 中,与它们一起玩,看看是否有工作,冲洗,重复。这是具有 REPL 的语言(如 Clojure、Haskell 和 CL 等)的主要优势之一。

    至于构建 jars,编译 Clojure 代码和其他东西,这很简单。如果您不想这样做,大多数时候您甚至都不会/拥有/ 来编译 Clojure 代码。当您这样做时,您使用 gen-class 进行 AOT 编译,后者将其编译为类文件,然后您可以将其放入 jar 中。互联网上散布着大量的示例甚至教程。最简单和最有效的方法是使用 Ant 之类的东西并编写一个构建脚本来编译 Clojure 代码并为您生成 .jar。第一次做的时候,我以为很难做,但实际上很简单。我只是查看了 Clojure 和 Clojure-Contrib Ant 构建文件,并参考了 Ant 帮助页面以了解我需要的所有其他内容。

    我应该提到的一件事是,Enclojure /does/ 实际上会为您构建可执行的 .jar 文件,如果您要求它这样做的话。我敢肯定,将来会添加您习惯的更高级的东西。事实上,它们仍然很新。

    【讨论】:

      【解决方案4】:

      我同时使用 Eclipse IDE 和提供 REPL 的逆时针插件。如果您与 Clojure 一起开发 Java 代码(就像我一样),这是一个特别好的组合。

      我的一般做法是:

      • 在编辑器中编写 Clojure 代码
      • 保持打开 REPL 以进行测试(此处 Ctrl+Enter 是一个有用的快捷方式:它会执行您在 REPL 的编辑器中选择的任何代码)
      • 使用通用 IDE 工具进行项目管理、构建、测试、SCM 等。

      有时,我也纯粹在 REPL 中工作。这通常更适合快速测试。如果我特别喜欢一段测试代码,我会简单地将它从 REPL 复制/粘贴到我的测试套件中。

      【讨论】:

        【解决方案5】:

        我所做的是与 Leiningen 一起创建一个项目。如果你只是想玩一会儿,你可以输入 lein repl 并且你的项目类路径将被设置为那个 repl。

        但实际上,我使用 Emacs、slime 和 swank clojure。导航到项目后,您只需键入 M-x clojure-jack-in。这将启动 swank 服务器并且 slime 连接到它,并且您在缓冲区中有一个 repl。当然,这并不比在 shell 中运行 repl 更有价值。你得到的是在另一个缓冲区中编写代码的能力,并通过键绑定选择sexps或更大的单元并在repl中执行它们以查看它是否有效。 slime 还为您提供了用于常见任务的便捷键绑定。有关详细信息,请参阅 github 上的 swank-clojure。

        JohnJ,你可以在 Emacs 中做同样的事情。实际上,这句话可能是同义反复。

        (add-hook 'after-save-hook etc.
        

        这是某人的 git 保存后挂钩示例:https://gist.github.com/449668

        【讨论】:

          【解决方案6】:

          使用 Eclipse,您可以在每次在项目中保存文件时运行单元测试(或任何程序)。整个过程不到一秒钟——它非常适合测试驱动的开发,并且在大多数情况下都不需要剪切和粘贴到 REPL 中。另外,您可以继续进行测试! :-)

          您需要使用cake 来避免每次启动测试时的 JVM 启动时间。您可以在命令行上运行cake test,或者在您保存项目中的任何文件时让 Eclipse 为您运行它。

          我通过使用Leiningen 设置项目、安装cake 并安装counterclockwise Eclipse 插件来实现此功能。要设置 Eclipse 以在每次保存时运行测试,请选择 Project->Properties->Builders,单击 New,选择 Program,将其命名为“运行测试”,将路径添加到 Location 下的 cake,选择 Working Directory为您的项目添加test 到可选参数。在“构建选项”选项卡下,选择“在自动构建期间”。

          我从 Jeff Younker 的书“敏捷 Python 开发的基础”中得到了大致的想法。从事 Emacs 工作 20 年,但这个技巧最近将 Eclipse 放在了我工作流程的前面。


          更新:大约一年后,我现在使用带有 lazytest 选项的 Midje 在使用 Emacs 和 Eclipse 进行开发时做同样的事情。

          【讨论】:

            【解决方案7】:

            “当我查看 Clojure 中的开发示例时,它们似乎类似于将文件加载到 REPL 中,看看它们是如何工作的,编辑文件,重新加载,重复。在任何地方都没有生成类或 jar。 ....如果可能的话,我想听听一些创建了一些非平凡程序供普通用户(而不是其他开发人员)使用的人的工作流程示例。”

            Debugging clojure functions which are invoked in java code (eclipse) 的示例很简单,但说明了如何在 eclipse 中链接项目,以便可以从 java 中调用 clojure/scala 功能。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-04-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-06-28
              • 2016-10-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多