【发布时间】:2011-01-13 21:49:08
【问题描述】:
我想学习新语言,我想从 Lisp 开始。我想知道如果我学习 Lisp 我是否也知道 Clojure(只需最少的努力),Lisp 和 Clojure 之间是否存在很大的语法差异?
【问题讨论】:
标签: clojure lisp common-lisp
我想学习新语言,我想从 Lisp 开始。我想知道如果我学习 Lisp 我是否也知道 Clojure(只需最少的努力),Lisp 和 Clojure 之间是否存在很大的语法差异?
【问题讨论】:
标签: clojure lisp common-lisp
语法差异不大(主要是因为 Lisp 家族语言几乎没有语法),但在其他方面肯定存在差异。 Clojure 具有许多现代编程特性,特别适合高可扩展性(actor、reference 等),而这些特性在“经典”Lisp(如 Common Lisp)中并不存在。
Clojure 是一种活跃的、受到良好支持的 Lisp 方言。如果你想学习 Lisp,那么 Clojure 绝对不会出错。
您可以在Which Lisp should I learn? 的回复中找到更多信息。
【讨论】:
您在学习第一个 Lisp 时所学的知识的 90% 将延续到您的下一个。
【讨论】:
我认为公平地说,如果您学习了 LISP 的原理,您也会知道 Clojure 的原理,反之亦然。它们都植根于相同的哲学,强调诸如:
代码就是数据。宏只是操作代码的普通函数。
使用S-expressions 表示数据和代码。
作为基本结构的列表/序列的概念。
具有一流函数的函数式编程。
除此之外,在语法、库、运行时环境等方面也有很多不同。在我看来,这可能与 C# 与 C++ 的差异大致相同——如果你很了解,那么核心概念就会很熟悉但仍然存在很多根本性差异。
【讨论】:
我假设 Lisp 是指 Common Lisp,因为“Lisp”本身更像是一个语言家族(包括 Clojure),而不是单一特定语言。 Clojure 旨在成为更现代的 Lisp,因此在语法上有一些变化。例如,您可以使用 [] 创建向量,使用 {} 创建映射,它们不是 Common Lisp 的一部分。当然,Java 互操作不可避免地会成为 Clojure 的重要组成部分。
【讨论】:
Clojure 使用向量作为 lambda 参数(参数值),但您可以使用宏在 Common lisp 中编写看起来相似的 defun 和 lambda 版本。 Clojure 还可以使用句点(即“.”)以及看起来像普通函数调用的方法或字段的名称来访问 Java 对象方法和字段。
(.toString 10) - 将在数字 10 上调用 toString 方法,但 .toString 不是函数。如果您尝试检查 .toString 的值,则会引发 .toString 不是已定义符号的异常。
还有准引号(主要在宏中)而不是像 Common lisp 中那样使用逗号来取消引用,Clojure 使用波浪号。
【讨论】: