将 Common Lisp 应用程序移植到 Clojure 有多实用?更具体地说,Common Lisp 中存在哪些 Clojure 中不存在且必须重写的功能?
4 回答
clojure.org 上有一份关于Clojure和其他 Lisps 之间差异的列表。我在使用 Clojure 时注意到的其他一些事情:
惯用的 Clojure 非常倾向于不可变的数据结构。您在 CL 中看到的任何地方都
SETF
可能需要在 Clojure 中进行更改才能充分利用。(您总是可以选择在 Clojure 中使用可变 Java 数据结构,但大多数人没有。)Clojure 的多方法类似于 CL(可以说更强大,因为您可以调度类型以外的东西),但 Clojure 中没有完整的 CLOS。Clojure
struct
改为使用它,这只是一个花哨的哈希图。当然,Java 的 OOP 系统也是可用的。有些人正在努力将 CLOS 移植到 Clojure,但我不确定目前这些努力进展到什么程度。在符号/命名空间解析方面,Clojure 宏的工作方式与 CL 宏略有不同。我不确定我是否理解得足够清楚以阐明差异。不过,您不必在 Clojure 中过多地使用 gensyms,这很好。
Clojure 没有像 CL 那样的条件系统。您只有 Java 的
try
//用于异常处理catch
。finally
Clojure 不允许用户定义阅读器宏。
Clojure 没有多个返回值。Clojure 中的解构非常好(支持列表、向量、哈希映射、集合等),并且默认情况下它内置在比 CL 更多的地方,所以这不是一个问题。
根据应用程序及其编写方式,从 CL 移植到 Clojure 可能是实用且直接的,或者以更实用、线程安全的方式从头开始重写以更好地适应 Clojure 风格可能更实用.
我没有具体的答案,但我推荐这些资源:
- Rich Hickey 的两 部分演讲 Clojure for Lisp Programmers
- Stuart Halloway将 Peter Seibel 的Practical Common Lisp中的示例翻译成 Clojure 的工作。
对于惯用的 CL 代码,它是一个重写。
- CL 是命令式的,Clojure 更纯粹是“功能性的”。
- CL 是面向对象 (CLOS),Clojure 不是(使用 Java 对象并具有一些 OO 机制)
- 标识符和语法大多不同。
- 数据结构不同。
- CL 大多是严格的(非惰性的),Clojure 使用惰性计算。
即使将必要的基础设施(CLOS、错误处理、流)移植到 Clojure 也没什么意义,因为 Clojure 确实是一种具有不同编程风格的不同语言。
如果不想重写代码,例如ABCL,它是 JVM 的 Common Lisp。