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。