将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。