将Common Lisp应用程序移植到Clojure有多实用?更具体地说,Common Lisp中存在哪些功能在Clojure中不存在,并且必须重写?
答案 0 :(得分:31)
Clojure和其他Lisps之间存在list on clojure.org的差异。我用Clojure注意到的其他一些事情:
惯用语Clojure倾向于不可变数据结构。您在CL中看到SETF
的任何地方都可能需要在Clojure中进行更改才能充分利用。 (您总是可以选择在Clojure中使用可变的Java数据结构,但大多数人不这样做。)
Clojure的多种方法类似于CL(可以说更强大,因为你可以派遣除了类型以外的东西)但是在Clojure中没有完整的CLOS。 Clojure使用struct
代替,这只是一个花哨的hashmap。当然,Java的OOP系统也可用。有些人正在努力将CLOS移植到Clojure,但我不确定这些努力到目前为止还有多远。
当涉及符号/名称空间解析时,Clojure宏的工作方式与CL宏略有不同。我不确定我是否理解得足够清楚这些差异。你不必在Clojure中混淆gensyms,这很不错。
Clojure没有类似CL的条件系统。您只有Java的try
/ catch
/ finally
用于异常处理。
Clojure不允许用户定义的阅读器宏。
Clojure没有多个返回值。 Clojure中的解构非常好(支持列表,向量,哈希映射,集合等),默认情况下它构建在比CL更多的位置,所以这不是一个问题。
根据应用程序及其编写方式,从CL移植到Clojure可能是实用且简单的,或者以更加功能,线程安全的方式从头开始重写它以更好地适应它可能更实际与Clojure风格。
答案 1 :(得分:8)
我没有具体的答案,但我推荐这些资源:
答案 2 :(得分:5)
有很多关于从CL过渡到Clojure的帐户(blog,another blog,Thread on HN)。
很多Common Lispers在第一次检查时遇到的最大问题是缺少 Tail Call Optimization ,这在JVM上是不可能的。
答案 3 :(得分:3)
对于惯用的CL代码,它是一个重写。
即使将必要的基础设施(CLOS,错误处理,流)移植到Clojure也没什么意义,因为Clojure实际上是一种具有不同编程风格的不同语言。
如果不想重写代码,可以使用ABCL,这是JVM的Common Lisp。