Clojure开发:IDE还是REPL?

时间:2009-10-23 00:51:25

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

我一直在使用Clojure一段时间,并希望创建一些比玩具更大更复杂的项目。我在过去的几年里一直在使用Java,并且已经习惯了IDE为我做的事情 - 编译大量的类,将它们打包在罐子里,为用户创建批处理文件以启动它们。

当我查看Clojure中的开发示例时,他们似乎是按照加载文件的方式进入REPL,看看它们是如何工作的,编辑文件,重新加载,重复。 Nary在任何地方生成一个类或jar。在Stuart Halloway非常棒的“Programming Clojure”中,我找不到一个例如“gen-class”的例子。我使用的Clojure IDE(ClojureBox和enlojure NetBeans插件)似乎促进了相同的工作流程。

这是故意的吗?这些工具是不成熟还是我没有“得到它”?

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

感谢您分享您的意见。

7 个答案:

答案 0 :(得分:12)

我认为这里确实有两个问题:

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

B)工作流程:

我的工作流程是这样的:

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

  2. 开始编写一些支持它的功能

  3. 2.5在创建函数定义时将其复制到REPL

    1. 打开另一个文件并编写一些基本测试以检查功能是否正常工作
    2. 3.5将这些复制到REPL

      1. 在构建测试的两个缓冲区之间进行迭代,以达到最终目标。这些最终成为类似的活动,我知道我已经完成了。

      2. 将参数文件包装成deftest

      3. 现在,当我一个月回来时,我可以运行我的测试并开心!保存REPL缓冲区可以轻松提供一些价值。这就是目前对我有用的东西,我很高兴能够接受更好的教育。

        至于IDE与REPL的选择 - 大多数IDE都有插件,这些插件都有REPL,所以我不确定它是一个还是另一个选择 - 真的只是关于你在哪个文本编辑器中工作,以及你想如何管理你的项目结构。没有任何'这样做'结构预制AFAIK所以在这一点上更容易看到特定的项目(如Clojure本身,或半影或组件或主站点上列出的任何库。

答案 1 :(得分:9)

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

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

答案 2 :(得分:6)

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

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

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

至于构建jar,编译Clojure代码和东西,这很简单。如果你不愿意的话,你甚至不会/大多数情况下编译Clojure代码。当你这样做时,你可以用gen-class编译它,它将它编译成类文件,然后你可以把它放到一个jar中。互联网中有大量的例子甚至是教程。最简单,最有效的方法是使用Ant之类的东西,编写一个构建脚本来编译Clojure代码并为你生成.jar。我第一次这样做,我觉得这很难做,但实际上真的很简单。我只是查看了Clojure和Clojure-Contrib Ant构建文件,并引用了Ant帮助页面以获取我需要的所有其他内容。

我应该提到的一件事是Enclojure /为你实际构建可执行的.jar文件,如果你要求的话。我相信你将来会增加更多先进的东西。事实上,它们仍然很新。

答案 3 :(得分:4)

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

我的一般方法是:

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

有时,我也纯粹在REPL工作。这通常可以更快地进行测试。如果我特别喜欢一段测试代码,我只需将它从REPL复制/粘贴到我的测试套件中。

答案 4 :(得分:1)

使用Eclipse,每次在项目中保存文件时都可以运行单元测试(或任何程序)。整个过程只需不到一秒钟 - 它对于测试驱动开发非常有用,并且在大多数情况下无需切入和粘贴到REPL中。另外,你可以保持测试! : - )

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

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

我从Jeff Younker的书“敏捷Python开发基础”中得到了一般性的想法。作为Emacs人已经20年了,但是这个技巧最近使Eclipse成为我工作流程的前沿。


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

答案 5 :(得分:1)

我所做的是与Leiningen一起创建一个项目。如果您只想暂时搁置一段时间,只需键入 lein repl ,就可以为该repl设置项目类路径。

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

JohnJ,你可以在Emacs中做同样的事情。实际上这个短语可能是一个重言式。

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

以下是git:https://gist.github.com/449668

之后某人的示例后保存挂钩

答案 6 :(得分:0)

  

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

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