【问题标题】:Is there big syntax differences between Clojure and LispClojure 和 Lisp 之间是否存在很大的语法差异
【发布时间】:2011-01-13 21:49:08
【问题描述】:

我想学习新语言,我想从 Lisp 开始。我想知道如果我学习 Lisp 我是否也知道 Clojure(只需最少的努力),Lisp 和 Clojure 之间是否存在很大的语法差异?

【问题讨论】:

    标签: clojure lisp common-lisp


    【解决方案1】:

    语法差异不大(主要是因为 Lisp 家族语言几乎没有语法),但在其他方面肯定存在差异。 Clojure 具有许多现代编程特性,特别适合高可扩展性(actor、reference 等),而这些特性在“经典”Lisp(如 Common Lisp)中并不存在。

    Clojure 是一种活跃的、受到良好支持的 Lisp 方言。如果你想学习 Lisp,那么 Clojure 绝对不会出错。

    您可以在Which Lisp should I learn? 的回复中找到更多信息。

    【讨论】:

    • 错了。 Lisp 有很多语法。吨。以示例检查 CL 中 DEFCLASS、DEFSTRUCT、LOOP 等的语法。下面是 s 表达式的语法——这也不是微不足道的。
    • 小点为了清楚起见,Rainer。他说“Lisp 家族”。您使用的所有示例都是 Common Lisp,我认为您给出的唯一有效示例是 LOOP,这是唯一一种混合了除列表之外的语法(关键字)的形式。即便如此,将您的所有示例与 Scheme 进行对比,其中几乎所有内容都是 DEFINE,并且您提到的结构都不存在。
    • @Shaun:Scheme 有内置的语法关键字和宏。见方案报告。它以 LET、LAMBDA、IF、... 开头。不要将 s-expression 与 Lisp 语法混淆。 Lisp 语法位于 s 表达式之上。 Lisp 通常有一个简单的函数调用形式。但是每个 Lisp 都有某种特殊的句法形式和某种宏。语言中已经存在的每个宏都实现了 SYNTAX。句法是一种语言的结构。用户定义的宏是每个 Lisp 中具有用户可扩展语法的一种方式。 “无语法”的想法只是一个经常重复的神话。反之亦然。
    • 我不同意。实际上,将语法与语义分开比通常理解的要难,而且 Clojure 的语义确实与 CL 非常不同。但即使我们只讨论比较语法有意义的地方——好吧,想象一下两种假设的语言,每种语言都有 10 条语法。现在想象它们有 9 个不同。它们仅在九点上有所不同,因为它们开头的语法很少,但这并不意味着它们在语法上没有区别——你拥有的语法越少(重要),差异就越重要。
    • 我的观点可能并不那么明智,如果你可以有意义地将 Clojure 的语法与 CL 的 Clojure 进行比较,往往会胜出。由于 Lisps 倾向于给您对语法的相当多的控制权,而 CL 比 Clojure 给您更多的控制权,这使情况变得复杂。 Clojure 和 CL 都有足够好的语法,它们的语义与您想要的匹配程度应该是最重要的问题。我希望 CL 有 Clojure 的用于映射/哈希表的字面语法,但这并不是一个足够大的问题,它会让我选择 Clojure 而不是 CL,因为 CL 显然更好。
    【解决方案2】:

    您在学习第一个 Lisp 时所学的知识的 90% 将延续到您的下一个。

    【讨论】:

      【解决方案3】:

      我认为公平地说,如果您学习了 LISP 的原理,您也会知道 Clojure 的原理,反之亦然。它们都植根于相同的哲学,强调诸如:

      • 代码就是数据。宏只是操作代码的普通函数。

      • 使用S-expressions 表示数据和代码。

      • 作为基本结构的列表/序列的概念。

      • 具有一流函数的函数式编程。

      除此之外,在语法、库、运行时环境等方面也有很多不同。在我看来,这可能与 C# 与 C++ 的差异大致相同——如果你很了解,那么核心概念就会很熟悉但仍然存在很多根本性差异。

      看到这个list of ways that Clojure is different from other Lisps

      【讨论】:

      • 函数和宏之间有“一点”区别。功能是一流的。宏不是。
      【解决方案4】:

      我假设 Lisp 是指 Common Lisp,因为“Lisp”本身更像是一个语言家族(包括 Clojure),而不是单一特定语言。 Clojure 旨在成为更现代的 Lisp,因此在语法上有一些变化。例如,您可以使用 [] 创建向量,使用 {} 创建映射,它们不是 Common Lisp 的一部分。当然,Java 互操作不可避免地会成为 Clojure 的重要组成部分。

      【讨论】:

      • [] 和 {} 保留用于 CL 中的用户扩展。向量写为#(...)。该级别的字符语法可以由库提供 - 实际上是。也许 CL 是更现代的 Lisp,因为语法是用户可扩展的,并且库可以使用 [] 和 {} 的使用?
      • Common Lisp 通常被称为 Lisp。同样,Lisp 通常表示 Common Lisp。 Lisp 系列通常表示为 lisp 或 lisp。
      【解决方案5】:

      Clojure 使用向量作为 lambda 参数(参数值),但您可以使用宏在 Common lisp 中编写看起来相似的 defunlambda 版本。 Clojure 还可以使用句点(即“.”)以及看起来像普通函数调用的方法或字段的名称来访问 Java 对象方法和字段。

      (.toString 10) - 将在数字 10 上调用 toString 方法,但 .toString 不是函数。如果您尝试检查 .toString 的值,则会引发 .toString 不是已定义符号的异常。

      还有准引号(主要在宏中)而不是像 Common lisp 中那样使用逗号来取消引用,Clojure 使用波浪号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-16
        • 2014-04-19
        • 2011-03-17
        • 2019-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多