将Common Lisp代码移植到Clojure
将Common Lisp应用程序移植到Clojure有多实用? 更具体地说,Common Lisp中存在的Clojure中不存在的特性,必须重写?
clojure.org上列出了 Clojure和其他Lisp之间的区别。 我注意到使用Clojure的一些其他的东西:
-
Clojure习惯性地倾向于不可变的数据结构。 任何你看到CL的
SETF
都可能需要在Clojure中改变才能充分利用。 (你总是可以select在Clojure中使用可变的Java数据结构,但大多数人不会。) -
Clojure的多方法类似于CL(可以说更强大,因为你可以派发除了types之外的东西),但是Clojure没有提供一个完整的CLOS。 Clojure使用
struct
而这只是一个奇特的hashmap。 当然,Java的OOP系统也是可用的。 有些人正在把CLOS移植到Clojure上,但我不确定在这方面做了多less努力。 -
当谈到符号/名称空间parsing时,Clojuremacros的工作方式与CLmacros稍有不同。 我不确定是否理解足够清楚的差异。 尽pipe在Clojure中,你不必与gensyms混淆,这很好。
-
Clojure没有像CL这样的条件系统。 你只有Java的
try
/catch
/finally
来处理exception。 -
Clojure不允许用户定义的阅读器macros。
-
Clojure没有多个返回值。 在Clojure中解构是非常好的(支持列表,向量,哈希映射,集合等),并且默认情况下它比CL更内置到更多的地方,所以这个问题不是一个问题。
根据应用程序以及它的写法,将CL从Clojure移植到Clojure可能是实用和直接的,或者更为实用的方法是以更加实用,线程安全的方式从头开始重写,以更好地适应Clojure风格。
我没有具体的答案,但我会推荐这些资源:
- Rich Hickey的两个 部分是为Lisp程序员谈论Clojure
- Stuart Halloway将Peter Seibel的Practical Common Lisp的例子翻译成Clojure。
有一些从CL到Clojure( 博客 , 另一个博客 , HN上的Thread )的转换帐户。
Clojure第一次检查时遇到的最大的问题是缺lessTail Call优化 ,这在JVM上是不可能的。
对于惯用的CL代码,这是一个重写。
- CL是必要的,Clojure更纯粹的“function”。
- CL是面向对象的(CLOS),Clojure没有(使用Java对象并且有一些OO机制)
- 标识符和语法大不相同。
- 数据结构是不同的。
- CL大多是严格的(非懒惰),Clojure使用懒惰的计算。
即使将必要的基础架构(CLOS,Error Handling,Streams)移植到Clojure也没什么意义,因为Clojure实际上是一种不同的编程风格的语言。
如果不想重写代码,则有例如ABCL ,这是JVM的Common Lisp。