将Common Lisp应用程序移植到Clojure有多实用?更具体地说,Common Lisp中存在哪些功能在Clojure中不存在,并且必须重新编写?
有一个关于clojure.org列表中的Clojure和其他的Lisp之间的差异.我注意到使用Clojure的其他一些事情:
惯用语Clojure倾向于不可变数据结构.您SETF
在CL中看到的任何地方都可能需要在Clojure中进行更改以充分利用它.(您始终可以选择在Clojure中使用可变Java数据结构,但大多数人不这样做.)
Clojure的多种方法类似于CL(可以说更强大,因为你可以发送除类型之外的其他东西),但Clojure中没有完整的CLOS.struct
相反,Clojure使用的只是一个花哨的hashmap.当然,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
斯图尔特哈洛韦的工作就从翻译彼得·塞贝尔的例子实用的Common Lisp到Clojure的.
有许多关于从CL转换到Clojure的报道(博客,另一篇博客,HN上的线程).
许多Common Lispers在Clojure首次检查时遇到的最大问题是缺少Tail Call Optimization,这在JVM上是不可能的.