将Common Lisp代码移植到Clojure

Porting Common Lisp code to Clojure

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


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为Lisp程序员分两部分讲Clojure
  • 斯图尔特·哈洛韦(Stuart Halloway)的工作将示例从彼得·塞贝尔(Peter Seibel)的《实践常见的Lisp》翻译成Clojure。


有许多从CL过渡到Clojure的帐户(博客,另一个博客,HN主题)。

很多常见的Lispers在初次检查Clojure时遇到的最大问题是缺少尾部调用优化,这在JVM上是不可能的。


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

  • CL势在必行,Clojure更纯粹是"功能性"。
  • CL是面向对象的(CLOS),而不是Clojure(使用Java对象并具有一些OO机制)
  • 标识符和语法大多不同。
  • 数据结构不同。
  • CL主要是严格的(非延迟),Clojure使用延迟计算。

即使将必要的基础结构(CLOS,错误处理,流)移植到Clojure也没有意义,因为Clojure实际上是具有不同编程风格的另一种语言。

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