18

I've been using Clojure for a little while and want to create some projects that are bigger and more complicated than toys. I've been using Java for the past few years and have become accustomed to what IDEs do for me -- compile lots of classes, package them up in jars, create batch files for users to start them with.

When I look at examples of development in Clojure they seem to be along the lines of load files into the REPL, see how they work, edit the file, reload, repeat. Nary a class or jar being generated anywhere. In Stuart Halloway's terrific "Programming Clojure" I couldn't find a single example of ":gen-class", for example. The Clojure IDEs that I have used (ClojureBox and the enclojure NetBeans plugin) seem to promote that same work flow.

Is this intentional? Are the tools too immature or do I just not "get it"?

I'd like to hear some work flow examples from folks who have created some non-trivial programs to be used by regular users (not other devs) if possible.

Thanks for sharing your opinions.

4

7 回答 7

12

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

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

B) 工作流程:

我的工作流程是这样的:

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

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

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

  1. 打开另一个文件并编写一些基本测试以检查功能是否有效

3.5 将这些复制到 REPL

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

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

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

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

于 2009-10-23T01:46:11.337 回答
9

The REPL development approach has been encouraged by most LISP family (and other functional language) IDE's for a long time. Some of these REPL's also feature the auto-complete features you might associate with a Java IDE.

REPL gives you a couple major advantages over the standard approach. The first is that it allows you to execute arbitrary code during the run-time of your program, which can make debugging multi-threaded systems much simpler. Second, and more importantly, it makes it easy to test your functions while you code. You don't need to build a framework around a new function or class, you can play with it directly in the REPL, and see how it responds to a variety of use cases.

于 2009-10-23T00:59:44.580 回答
6

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

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

对于具有 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 文件,如果您要求它这样做的话。我相信将来会添加您习惯的更高级的东西。事实上,它们仍然很新。

于 2009-10-23T03:24:23.900 回答
4

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

我的一般做法是:

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

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

于 2011-02-02T20:18:36.287 回答
1

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

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

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

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


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

于 2011-11-03T19:27:18.777 回答
1

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

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

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

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

这是某人的 git after-save-hook 示例:https ://gist.github.com/449668

于 2012-04-17T14:16:14.397 回答
0

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

调试在 java 代码中调用的 clojure 函数 (eclipse)中的示例是微不足道的,但说明了如何在 eclipse 中链接项目,以便可以从 java 中调用 clojure/scala 功能。

于 2011-08-31T05:39:21.510 回答