【发布时间】:2011-08-25 21:13:24
【问题描述】:
我的问题的意图是不是发起一场激烈的战争,而是要确定每种语言在什么情况下是“完成这项工作的最佳工具”。
我已经阅读了几本关于 Clojure 的书籍(Programming Clojure、Practical Clojure、The Joy of Clojure 和 Clojure in Action 的曼宁抢先体验版),我认为它是一门很棒的语言。我目前正在阅读Let Over Lambda,它主要处理 Common Lisp 宏,而且它也是一种非常有趣的语言。
我不是 Lisp 专家(更像是一个新手),但是这个语言家族让我着迷,就像函数式编程一样。
Clojure 的优点(以及“其他”的缺点):
-
在 JVM 上运行。
JVM 是一个非常稳定的高性能语言环境,非常符合 Sun 的“一次编写,[几乎] 随处运行”的梦想。我可以在我的 Macbook Pro 上编写代码,将其编译成可执行的 JAR 文件,然后在 Linux 和 Microsoft Windows 上运行它,几乎不需要额外的测试。
(Hotspot 和其他)JVM 支持高质量的垃圾收集和非常高性能的即时编译和优化。就在几年前,我用 C 编写了所有必须快速运行的东西,现在我毫不犹豫地用 Java 编写了。
标准、简单、多线程模型。 Common Lisp 有标准的多线程包吗?
用
[]、{}和#{}打破所有这些括号的单调,尽管 Common Lisp 专家可能会告诉我,使用阅读器宏,您可以将它们添加到 CL。
Clojure 的缺点:
- 在 JVM 上运行。
- 没有尾递归或延续。 Common Lisp 是否支持延续?我相信,Scheme 需要同时支持两者。
其他方法的优点(尤其是 Common Lisp)(以及 Clojure 的缺点):
用户可定义的阅读器宏。
其他优势?
想法?其他区别?
【问题讨论】:
-
我个人喜欢一种括号;)看起来像“更干净”的代码
-
从我读到的你的优点列表中,我想你可能也喜欢 Erlang www.erlang.org
-
Clojure 通过“recur”特殊形式支持显式尾递归。如果您明确要求,这使您能够获得尾递归的所有好处(唯一的例外是它目前不支持多个函数之间的相互尾递归)。
-
Clojure 也支持延续,至少在“延续传递风格”的意义上。你是对的,它没有一流的延续。见stackoverflow.com/questions/1173133/continuations-in-clojure
-
@mikera:一个函数的尾递归。两个相互调用的函数必须通过“蹦床”来完成,这有点笨拙(但以自己的方式优雅:-))。
标签: clojure comparison lisp scheme common-lisp