Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure与其他Lisp_Clojure_Comparison_Lisp_Scheme_Common Lisp - Fatal编程技术网

Clojure与其他Lisp

Clojure与其他Lisp,clojure,comparison,lisp,scheme,common-lisp,Clojure,Comparison,Lisp,Scheme,Common Lisp,我的问题的目的不是发动一场火焰战,而是要确定在什么情况下每种语言都是“工作的最佳工具” 我读过几本关于Clojure的书(、、和的Manning早期访问版),我认为这是一种很棒的语言。我目前正在阅读的主要是关于常见Lisp宏的,它也是一种非常有趣的语言 我不是Lisp专家(更多的是新手),但这一系列语言和函数式编程一样让我着迷 Clojure的优点(以及“其他”的缺点): 在JVM上运行 JVM是一个非常稳定、高性能的语言环境,它很好地满足了Sun的“编写一次,几乎在任何地方运行”的梦想。我

我的问题的目的不是发动一场火焰战,而是要确定在什么情况下每种语言都是“工作的最佳工具”

我读过几本关于Clojure的书(、、和的Manning早期访问版),我认为这是一种很棒的语言。我目前正在阅读的主要是关于常见Lisp宏的,它也是一种非常有趣的语言

我不是Lisp专家(更多的是新手),但这一系列语言和函数式编程一样让我着迷

Clojure的优点(以及“其他”的缺点):

  • 在JVM上运行

    • JVM是一个非常稳定、高性能的语言环境,它很好地满足了Sun的“编写一次,几乎在任何地方运行”的梦想。我可以在MacBookPro上编写代码,将其编译成一个可执行的JAR文件,然后在Linux和MicrosoftWindows上运行,无需额外测试

    • (热点和其他)JVM支持高质量的垃圾收集和非常高性能的即时编译和优化。就在几年前,我用C写了所有必须快速运行的东西,现在我毫不犹豫地用Java写

    • 标准、简单、多线程模型。Common Lisp是否有标准的多线程程序包

    • []
      {}
      {}
      打破所有括号的单调性,尽管常见的Lisp专家可能会告诉我,使用reader宏,可以将它们添加到CL中

Clojure的缺点

  • 在JVM上运行。
    • 没有尾部递归或延续。公共Lisp支持延续吗?我相信这项计划需要两方面的支持
其他人的优点(特别是常见的Lisp)(以及Clojure的缺点):

  • 用户可定义的读卡器宏

  • 其他优势


想法?其他区别?

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),我个人更喜欢它(我认为在函数式语言中,将函数和数据保持在同一名称空间是有意义的)


这是一个很好的视频,有一个

公平地说,Racket也为数据类型(散列、方括号等)提供了语法糖(额外的读取器内容)

另外,Clojure进行适当尾部调用的唯一方法是使用
recur
,这是编译到JVM的缺点

请注意,
recur
是Clojure中唯一的非堆栈消耗循环构造。没有尾声 不鼓励对未知边界的循环进行优化和使用自调用<代码>重复是 编译器验证了函数及其在尾部位置的使用。()


请记住,Clojure是一种语言和一种实现(通常在JVM上)。CommonLisp是一种具有十多种不同实现的语言。所以我们这里有一个类别不匹配。例如,您可以将Clojure与SBCL进行比较

一般来说:

  • 公共Lisp的一个版本在JVM上运行:ABCL

  • 大多数其他常见的Lisp实现都没有

  • 大多数CL实现都具有多任务功能,库提供了一个公共接口

  • Common Lisp具有数组的语法。其他数据类型的语法可以由用户编写,并由各种库提供

  • Common Lisp既不支持尾部调用优化,也不支持延续。实现提供了TCO,库提供了某种形式的延续

就我个人而言,我喜欢一种