将Common Lisp代码移植到Clojure

时间:2009-02-27 16:43:39

标签: lisp clojure common-lisp

将Common Lisp应用程序移植到Clojure有多实用?更具体地说,Common Lisp中存在哪些功能在Clojure中不存在,并且必须重写?

4 个答案:

答案 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的帐户(bloganother blogThread on HN)。

很多Common Lispers在第一次检查时遇到的最大问题是缺少 Tail Call Optimization ,这在JVM上是不可能的。

答案 3 :(得分:3)

对于惯用的CL代码,它是一个重写。

  • CL是必不可少的,Clojure更纯粹是“功能性”。
  • CL是面向对象的(CLOS),Clojure不是(使用Java对象并且有一些OO机制)
  • 标识符和语法大多不同。
  • 数据结构不同。
  • CL主要是严格的(非懒惰),Clojure使用延迟计算。

即使将必要的基础设施(CLOS,错误处理,流)移植到Clojure也没什么意义,因为Clojure实际上是一种具有不同编程风格的不同语言。

如果不想重写代码,可以使用ABCL,这是JVM的Common Lisp。