Clojure与其他Lisp
我的问题的目的不是发动一场火焰战,而是要确定在什么情况下每种语言都是“工作的最佳工具” 我读过几本关于Clojure的书(、、和的Manning早期访问版),我认为这是一种很棒的语言。我目前正在阅读的主要是关于常见Lisp宏的,它也是一种非常有趣的语言 我不是Lisp专家(更多的是新手),但这一系列语言和函数式编程一样让我着迷 Clojure的优点(以及“其他”的缺点):Clojure与其他Lisp,clojure,comparison,lisp,scheme,common-lisp,Clojure,Comparison,Lisp,Scheme,Common Lisp,我的问题的目的不是发动一场火焰战,而是要确定在什么情况下每种语言都是“工作的最佳工具” 我读过几本关于Clojure的书(、、和的Manning早期访问版),我认为这是一种很棒的语言。我目前正在阅读的主要是关于常见Lisp宏的,它也是一种非常有趣的语言 我不是Lisp专家(更多的是新手),但这一系列语言和函数式编程一样让我着迷 Clojure的优点(以及“其他”的缺点): 在JVM上运行 JVM是一个非常稳定、高性能的语言环境,它很好地满足了Sun的“编写一次,几乎在任何地方运行”的梦想。我
- 在JVM上运行
- JVM是一个非常稳定、高性能的语言环境,它很好地满足了Sun的“编写一次,几乎在任何地方运行”的梦想。我可以在MacBookPro上编写代码,将其编译成一个可执行的JAR文件,然后在Linux和MicrosoftWindows上运行,无需额外测试
- (热点和其他)JVM支持高质量的垃圾收集和非常高性能的即时编译和优化。就在几年前,我用C写了所有必须快速运行的东西,现在我毫不犹豫地用Java写
- 标准、简单、多线程模型。Common Lisp是否有标准的多线程程序包
- 用
、[]
和{}
打破所有括号的单调性,尽管常见的Lisp专家可能会告诉我,使用reader宏,可以将它们添加到CL中{}
- 在JVM上运行。
- 没有尾部递归或延续。公共Lisp支持延续吗?我相信这项计划需要两方面的支持
- 用户可定义的读卡器宏
- 其他优势
想法?其他区别?Clojure和Common Lisp之间的一个重要区别是Clojure在函数式编程方面更具规范性。Clojure的哲学、习惯用法以及某种程度上的语言/库强烈鼓励并有时坚持以功能性方式编程(没有副作用,没有可变状态) CommonLisp肯定支持函数式编程,但它也允许可变状态和命令式编程
当然,函数式编程在并发和其他方面有很多好处。但在所有其他条件相同的情况下,也可以选择在每种情况下使用哪种方法。Clojure并没有完全禁止命令式编程,但它比普通的Lisp更不适合这种风格。我个人喜欢Clojure而不是其他Lisp的原因列表(请注意,我仍然认为所有的Lisp都很棒!)
- 在JVM上运行-因此可以自动访问JVM本身的奇妙工程(高级垃圾收集算法、热点JIT优化等)
- 非常好的Java互操作性—提供了与Java/JVM语言生态系统中大量库的兼容性。我使用Clojure作为一种“粘合”语言来连接不同的Java库,效果很好。由于我还开发了大量Java代码,Clojure与Java工具的良好集成对我很有帮助(例如,我使用Maven、Eclipse和逆时针插件进行Clojure开发) <> L>>P>漂亮的语法:矢量<代码> [ 1 2 3 ] <代码>,地图<代码> { Bob 10,:Jane 15 } <代码>,并设置<代码> {“A”“B”“C”} /代码> -我认为这些是现代编程(除了当然列表)的非常必要的工具
- 我个人喜欢使用方括号来绑定表单:例如,
-我认为这样可以使代码更清晰易读(defn foo[ab](+ab))
- 强调具有持久不变数据结构的惰性函数式编程,尤其是所有核心Clojure库在默认情况下都支持这一点
- 多核并发的优秀STM实现。我相信Clojure目前拥有所有语言中最好的并发故事(见下图)
- 这是一个Lisp-1(类似于Scheme),我个人更喜欢它(我认为在函数式语言中,将函数和数据保持在同一名称空间是有意义的)
recur
,这是编译到JVM的缺点
请注意,recur
是Clojure中唯一的非堆栈消耗循环构造。没有尾声
不鼓励对未知边界的循环进行优化和使用自调用<代码>重复是
编译器验证了函数及其在尾部位置的使用。()
请记住,Clojure是一种语言和一种实现(通常在JVM上)。CommonLisp是一种具有十多种不同实现的语言。所以我们这里有一个类别不匹配。例如,您可以将Clojure与SBCL进行比较 一般来说:
- 公共Lisp的一个版本在JVM上运行:ABCL
- 大多数其他常见的Lisp实现都没有
- 大多数CL实现都具有多任务功能,库提供了一个公共接口
- Common Lisp具有数组的语法。其他数据类型的语法可以由用户编写,并由各种库提供
- Common Lisp既不支持尾部调用优化,也不支持延续。实现提供了TCO,库提供了某种形式的延续