35

将 Common Lisp 应用程序移植到 Clojure 有多实用?更具体地说,Common Lisp 中存在哪些 Clojure 中不存在且必须重写的功能?

4

4 回答 4

32

clojure.org 上有一份关于Clojure和其他 Lisps 之间差异的列表。我在使用 Clojure 时注意到的其他一些事情:

  • 惯用的 Clojure 非常倾向于不可变的数据结构。您在 CL 中看到的任何地方都SETF可能需要在 Clojure 中进行更改才能充分利用。(您总是可以选择在 Clojure 中使用可变 Java 数据结构,但大多数人没有。)

  • Clojure 的多方法类似于 CL(可以说更强大,因为您可以调度类型以外的东西),但 Clojure 中没有完整的 CLOS。Clojurestruct改为使用它,这只是一个花哨的哈希图。当然,Java 的 OOP 系统也是可用的。有些人正在努力将 CLOS 移植到 Clojure,但我不确定目前这些努力进展到什么程度。

  • 在符号/命名空间解析方面,Clojure 宏的工作方式与 CL 宏略有不同。我不确定我是否理解得足够清楚以阐明差异。不过,您不必在 Clojure 中过多地使用 gensyms,这很好。

  • Clojure 没有像 CL 那样的条件系统。您只有 Java 的try//用于异常处理catchfinally

  • Clojure 不允许用户定义阅读器宏。

  • Clojure 没有多个返回值。Clojure 中的解构非常好(支持列表、向量、哈希映射、集合等),并且默认情况下它内置在比 CL 更多的地方,所以这不是一个问题。

根据应用程序及其编写方式,从 CL 移植到 Clojure 可能是实用且直接的,或者以更实用、线程安全的方式从头开始重写以更好地适应 Clojure 风格可能更实用.

于 2009-02-27T20:45:57.710 回答
8

我没有具体的答案,但我推荐这些资源:

于 2009-02-27T16:54:00.373 回答
6

有许多关于从 CL 过渡到 Clojure 的说明(博客另一个博客HN 上的线程)。

许多 Common Lispers 在第一次检查 Clojure 时遇到的最大问题是它缺少Tail Call Optimization,这在 JVM 上是不可能的。

于 2009-02-27T17:05:54.010 回答
3

对于惯用的 CL 代码,它是一个重写。

  • CL 是命令式的,Clojure 更纯粹是“功能性的”。
  • CL 是面向对象 (CLOS),Clojure 不是(使用 Java 对象并具有一些 OO 机制)
  • 标识符和语法大多不同。
  • 数据结构不同。
  • CL 大多是严格的(非惰性的),Clojure 使用惰性计算。

即使将必要的基础设施(CLOS、错误处理、流)移植到 Clojure 也没什么意义,因为 Clojure 确实是一种具有不同编程风格的不同语言。

如果不想重写代码,例如ABCL,它是 JVM 的 Common Lisp。

于 2010-11-27T13:49:57.230 回答