【问题标题】:What are the differences between Clojure, Scheme/Racket and Common Lisp?Clojure、Scheme/Racket 和 Common Lisp 之间有什么区别?
【发布时间】:2012-06-28 17:16:03
【问题描述】:

我知道它们是同一个语言家族的方言,称为 lisp,但究竟有什么区别?如果可能的话,您能否提供一个概述,涵盖诸如语法、特征、特性和资源等主题。

【问题讨论】:

  • 我要求对差异进行更一般的概述,因为我觉得这个问题可能对许多其他人有用,如果听起来有辱骂,请见谅。
  • 我总是对哪个帖子应该放在哪里感到困惑。这是对工具的讨论,所以这是给这里的问题还是程序员的问题?从逻辑上讲,我会说把它转移给程序员,因为它不是要求解决一个特定的问题,但这是一个很好的帖子,有一个很好的答案恕我直言。
  • @octopusgrabbus:这个问题太宽泛了。在“语法、特性、特性和资源”方面比较三种编程语言可以轻松填满一本书或一个网站。 Stackoverflow 是为有编程问题的人准备的,它不是百科全书(Wikipedia),也不是一般讨论论坛(Usenet),也不是语言比较网站(rosettacode.org)。它最适合真正的编程问题,其中问题有代码,答案也有代码。另外:不要仅仅因为某人无聊或那是一种爱好而编造问题。
  • 问题范围很广并不意味着它不属于这里。这是一个非常清晰的问题,当然也是一个“真正的编程问题”。 StackOverflow 的主要目的是成为一个 [googleable] 社区资源,用于通过问答形式分享编程知识。
  • @MaiaVictor:回头看没有发布有用的答案。人们大多只懂一种语言,无法有效地比较它们。

标签: clojure lisp scheme common-lisp racket


【解决方案1】:

不要忘记 Lisp-1 和 Lisp-2 的区别。

Scheme 和 Clojure 是 Lisp-1:
这意味着变量和函数名称都位于同一个命名空间中。

常见的 Lisp 是 Lisp-2:
函数和变量有不同的命名空间(其实CL有很多命名空间)。

【讨论】:

    【解决方案2】:

    Gimp 是用 Scheme 编写的 :)

    事实上,一些人认为可能用 C++ 编写的软件可能是在 Lisp 的保护伞下完成的,很难从一堆中挑选出金苹果。事实上,C++ 并不总是很流行,它只是在今天才流行起来,因为它有更新的历史。在本世纪下半叶,C++ 甚至没有使用多线程,它是 Python 今天成为无用未经测试的错误胶水代码的污水池的地方。快进一点,现在我们看到函数式编程的兴起,它更像是适应或死亡。我认为就适配部分而言,Java 是正确的。

    Scheme 旨在简化 Lisp 语言,这是它的唯一目的,只是它从未真正流行起来。我认为 Clojure 做了类似的事情来简化 JVM 的方案。它就像所有其他 JVM 语言一样只是为了提升用户体验,只是为了简化 Java 领域的编写样板。

    【讨论】:

    • “只是为了简化 JVM 的 Scheme 而已”“就像所有其他 JVM 语言一样”是的,对。
    • Gimp 是用 C 语言编写的,它支持 Scheme、Python 和 Perl 作为脚本语言。
    【解决方案3】:

    他们都有很多共同点:

    • 动态语言
    • Strongly typed
    • 已编译
    • Lisp 风格的语法,即代码被编写为 Lisp 数据结构(表单),最常见的模式是函数调用,例如:(function-name arg1 arg2)
    • 强大的宏系统允许您将代码视为数据并在运行时生成任意代码(通常用于使用新语法“扩展语言”或创建 DSL)
    • 通常用于函数式编程风格,虽然能够适应其他范式
    • 强调使用 REPL 进行交互式开发(即您在代码的运行实例中进行交互式开发)

    Lisp 的共同特点:

    Clojure 的显着特点:

    • 最大的库生态系统,因为您可以直接使用任何 Java 库
    • 矢量[] 和地图{} 用作标准列表() 之外的标准 - 除了矢量和地图的一般有用性之外,一些人认为这是一项创新,通常更具可读性
    • 更加强调不变性和惰性函数式编程,在某种程度上受到 Haskell 的启发
    • 语言级别的软件事务内存支持强大的并发能力(值得关注:http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

    方案特色:

    【讨论】:

    • 这很好,但也许你应该提到球拍不仅仅是“公正”的方案;它是一个支持多种(但相关)语言的系统(您甚至可以定义自己的语言)。此外,clojure 有多种方式进行类似 oo 的编程(一种类似于 clos 的多分派方法和更接近 java 的方法,在 jvm 上更有效)。并且 scheme 正在向带有 r6rs 的更多标准库(也包括 oo)发展,球拍支持。
    • “强类型动态语言”是营销。从这个意义上说,即使是 Python 也是强类型的。
    • @ron: Python 强类型,就像 Lisp 一样(不像 Javascript 或 VB)。您正在考虑“静态类型”与“动态类型”,请参阅en.wikipedia.org/wiki/Type_system 了解所有类型。但是,是的,这是营销
    • 我也认为将 Racket 添加到此答案中会很好。由于社区和语言的重点,我认为 Racket 比 Scheme 更容易学习。 Racket(以前称为 PLT Scheme)是 Lisp/Scheme 系列中的一种通用、多范式编程语言。它的设计目标之一是作为语言创建、设计和实施的平台。
    • Clojure 有卫生的宏。更多信息在这里:xivilization.net/~marek/blog/2013/09/17/…
    【解决方案4】:

    上面的人漏掉了一些东西

    1. Common Lisp 也有向量和哈希表。不同之处在于 Common Lisp 使用 #() 表示向量,而没有使用哈希表的语法。 Scheme 有向量,我相信

    2. Common Lisp 有阅读器宏,允许您使用新的括号(Racket 也是如此,Scheme 的后代)。

    3. Scheme 和 Clojure 具有卫生宏,而 Common Lisp 的不卫生宏

    4. 所有语言要么是现代的,要么有大量的翻新项目。 Common Lisp 在过去五年中获得了大量的库(主要归功于 Quicklisp),Scheme 有一些现代实现(Racket、Chicken、Chez Scheme 等),而 Clojure 是最近才创建的

    5. Common Lisp 有一个内置的 OO 系统,尽管它与您可能使用的其他 OO 系统完全不同。值得注意的是,它不是强制执行的——您没有必须编写 OO 代码。

    6. 这些语言的设计理念有些不同。 Scheme 被设计为用于理解 Actor 模型的最小方言;它后来被用于教育学。 Common Lisp 旨在统一大量涌现的 Lisp 方言。 Clojure 是为并发而设计的。因此,Scheme 以简约而优雅、Common Lisp 功能强大且与范式无关(函数式、OO 等)而著称,而 Clojure 则以函数式编程而著称。

    【讨论】:

    猜你喜欢
    • 2012-01-16
    • 2013-06-24
    • 2016-02-18
    • 2011-04-23
    • 2021-09-04
    • 2012-03-25
    • 1970-01-01
    • 2010-11-12
    • 2011-04-20
    相关资源
    最近更新 更多