将Common Lisp代码移植到Clojure

Col*_*lin 34 lisp clojure common-lisp

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

Bri*_*per 31

有一个关于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风格可能更实用.

  • Clojure也是一个Lisp 1(带有命名空间),而CL是一个Lisp 2.这是一个非常重要的区别,它会对宏产生巨大影响,并且在较小程度上影响变量和函数声明. (9认同)
  • 它可以发送任何东西.您提供自己的任意调度功能. (6认同)

zwe*_*nde 8

我没有具体的答案,但我推荐这些资源:


Bri*_*aro 5

有许多关于从CL转换到Clojure的报道(博客,另一篇博客,HN上的线程).

许多Common Lispers在Clojure首次检查时遇到的最大问题是缺少Tail Call Optimization,这在JVM上是不可能的.

  • 这就是你使用recur的原因. (6认同)
  • 许多CL也没有(它不是必需的),我不知道依赖它的任何程序(mers).例如,除非您使用动态空间优化,否则SBCL/CMUCL不会. (4认同)