Clojure 对比其他 Lisp

标签 clojure comparison lisp scheme common-lisp

<分区>

我的问题的目的是不是开始一场口水战,而是要确定每种语言在什么情况下是“完成这项工作的最佳工具”。

我读过几本关于 Clojure 的书( Programming ClojurePractical ClojureThe Joy of ClojureClojure in Action 的 Manning 抢先体验版),我认为这是一门很棒的语言。我目前正在阅读 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 的缺点):

  • 用户可定义的阅读器宏。

  • 其他优势?

想法?其他区别?

最佳答案

我个人更喜欢 Clojure 而不是其他 Lisp 的原因列表(附注:我仍然认为所有 Lisp 都很棒!):

  • 在 JVM 上运行 - 因此可以自动访问 JVM 本身的出色工程(高级垃圾收集算法、HotSpot JIT 优化等)

  • 非常好的 Java 互操作性 - 提供与 Java/JVM 语言生态系统中大量库的兼容性。我曾使用 Clojure 作为“胶水”语言来连接不同的 Java 库,效果很好。由于我还开发了大量 Java 代码,因此 Clojure 与 Java 工具的良好集成对我很有帮助(例如,我使用 Maven、Eclipse 和 Counterclockwise 插件进行 Clojure 开发)

  • 向量 [1 2 3]、映射 {:bob 10, :jane 15} 和集合 #{"a""b""c"} - 我认为这些是现代编程必不可少的工具(当然还有列表!)

  • 我个人喜欢使用方括号来表示绑定(bind)形式:例如(defn foo [a b] (+ a b)) - 我认为它使代码更易读。

  • 强调具有持久、不可变数据结构的惰性函数式编程——特别是所有核心 Clojure 库都旨在默认支持这一点

  • 出色的 STM 多核并发实现。我相信 Clojure 目前拥有所有语言中最好的并发故事(参见 video for more elaboration by Rich Hickey himself)

  • 这是我个人更喜欢的 Lisp-1(类似于 Scheme)(我认为在函数式语言中,将函数和数据保存在同一个命名空间中是有意义的)

关于Clojure 对比其他 Lisp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6008313/

相关文章:

lisp - 如何从 Common Lisp 中的哈希表返回值?

python - 如何在 Python 中创建动态范围变量?

lisp - 如何让 defun 接受一个列表作为它的参数

clojure - 热修复 "WARNING: any? already refers to: #' clojure.core/any?在命名空间 : leiningen. midje 中,被替换为:#'leiningen.midje/any?"

clojure - 为大量 Clojure 代码切换区分大小写

PHP/MySQL 在比较网格或表格中显示产品和类别

python - 从矩阵中找到第一个匹配子矩阵的快速方法

clojure - 在 Clojure 中管理资源池的最佳方式

logging - Clojure - 配置 `timbre` 日志记录

language-agnostic - 添加 MIN_VALUE 如何将整数比较为无符号?