从Lisp学习Clojure

3

我在认真考虑将Clojure作为我的新编程语言,因为我喜欢Lisp,但是在CL和Scheme上遇到了一些问题。我以前从未在Java环境下工作过,我的Lisp经验仅限于通过《SICP》和《The Little Schemer》的学习。

我需要知道什么?有没有关于“Clojure方式”的好资源?有没有关于Clojure风格的资源?我找到了Mark Volkmann的优秀页面,但我看过的书似乎有点简略。

此外,我需要了解Java的哪些内容?我宁愿不去学Java而去学Clojure,但我想我至少需要了解一点Java。另外,工作流程是怎样的?我的经验仅限于动态语言,所以我不知道在JVM上发布一个没有源代码的应用程序需要做些什么。

我已经搜索过了,但是信息量很大,而且没有太多“Clojure特定”的东西。

我想寻求一些合理的建议,以便按照某种逻辑顺序阅读相关文献。


1
严格来说,Clojure是一种Lisp。 - Paul Nathan
哈,我意识到我的帖子让我听起来好像不知道那个。这就是我选择学习Clojure的原因,因为它是一种Lisp。 - afkbowflexin
2个回答

15

尽可能多地观看Blip.tv上的Clojure视频,特别是由Rich Hickey本人制作的视频可帮助您深刻理解Clojure的概念和独特方面。

如果您足够熟悉Lisp的概念,您可能希望最初专注于学习Clojure与您玩过的Lisps之间的“映射”。观看Rich Hickey在“Clojure for Lisp Programmers”上的视频。

您需要对Java有一定的了解,因为Clojure不会回避使用它。在明智的情况下,使用Java并非与Clojure相抵触(就我所知)。我至少会浏览java.langjava.io包的API文档,因为java.lang在您的Clojure程序中自动可用,并且java.io经常被使用。

掌握了我心中的Clojure-to-Lisp词典以及Java基础知识后,我会选择一个小项目进行工作。随时准备好Clojure和Clojure-contrib API文档(可以在Web上或从REPL使用(doc)命令),并查看众多Clojure博客。我最喜欢的两个博客是http://nakkaya.com/http://stuartsierra.com/。如果您使用Diigo,则可以将大量博客添加到clojure group

注意:不要在你的开发环境上卡顿。在入门wiki页面上列出了多种选项。对于学习Clojure和您的第一个小项目,我建议您只选择您喜欢的纯文本编辑器,学习并使用Leiningen的基础知识,设置一个漂亮的项目目录,并处理好所有路径和依赖项,然后使用命令"lein repl"启动一个REPL,其中包含您加载并可用的所有依赖项。假设您使用Emacs(基于您之前的Lisp经验),您可以描述变量将您的inferior-lisp-program设置为lein repl,并从示例项目的根目录开始启动Emacs,让一切自动化工作。
书籍可供阅读,特别是《Clojure之乐》、《Clojure编程》和《实用Clojure》。后两者比第一本更加“实用”,而第一本更加“哲学”(请原谅我的粗略概括)。《实用Clojure》更新到Clojure 1.2,而《Clojure编程》则稍微有些陈旧。
最后,加入#clojure IRC频道并使用Clojure Google组,因为有一群聪明、友好的人喜欢帮助其他人。

1
对于Emacs,我更喜欢使用swank-clojure而不是原始的inferior-lisp接口。此外,在我看来,paredit对于任何Emacs Lisp编辑都是必不可少的。对于这个很好的回答,没有其他需要补充的了 :) - bsteuber
我还推荐《Clojure实战》,它可以通过MEAP获取,就像《Clojure之乐》一样。这本书包含了许多示例,与《实用Clojure》相比更加丰富,并且与《编程Clojure》相比也更加更新。 - Alex Ott
我买了《Clojure实战》的MEAP版本;虽然它充满了非常有趣的内容并探索了一些独特的问题领域,但我觉得它不如其他我读过的MEAP版本那么精细,有时作者没有把一个概念或示例详细地讲解完毕。话虽如此,它关于数据存储、处理、Web和消息传递的章节值得一读。 - semperos

2

我是从Java转向Clojure的,这里给你一个快速的视角。

  • 一旦你掌握了语法和常用习惯,我发现Clojure中Lispy部分很容易学习。我相信对你来说更容易。
  • 你不需要太多的Java知识就可以完成大部分工作——如果你愿意,你可以在纯Clojure中完成几乎所有工作。
  • 只有当你开始想使用Java库时,你才需要深入研究Java互操作性。幸运的是,互操作性非常简单——它更像LISP风格而不是Java风格,所以你需要做的唯一的事情就是理解Java接口并从Clojure端进行适当的调用。

对于我的开发环境,我使用Eclipse + Counterclockwise。如果您喜欢IDE或者认为您最终可能也想做一些Java方面的工作,这个组合非常适合。它不需要其他依赖项,提供了出色的调试器、完整的REPL(我相信是内置的nREPL),处理所有项目文件管理(Git、SVN等)并自动处理Java类路径设置(这对于Java的新手来说可能是一个重大障碍!)。如果你认为这可能适合你的风格,我建议你去试试,我也听说过Enclojure不错。

如果你不喜欢IDE,那么像semperos在他出色的答案中建议的那样,你最好使用你喜欢的文本编辑器和命令行工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接