Clojure和Lisp之间有很大的语法差异吗

Clojure和Lisp之间有很大的语法差异吗,clojure,lisp,common-lisp,Clojure,Lisp,Common Lisp,我想学习新的语言,我想从Lisp开始。我想知道如果我学习了Lisp,我是否也知道Clojure(用最少的努力),Lisp和Clojure之间有很大的语法差异吗?没有很大的语法差异(主要是因为Lisp族语言几乎没有语法),但在其他方面肯定有差异。Clojure有许多现代编程特性,特别适合于“经典”Lisp(如Common Lisp)中没有的高可伸缩性(参与者、引用等) Clojure是一种活跃的、受支持的Lisp方言。如果你想学一口口齿不清的语言,你就不能真的错用Clojure 您可以在的答案中找

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

没有很大的语法差异(主要是因为Lisp族语言几乎没有语法),但在其他方面肯定有差异。Clojure有许多现代编程特性,特别适合于“经典”Lisp(如Common Lisp)中没有的高可伸缩性(参与者、引用等)

Clojure是一种活跃的、受支持的Lisp方言。如果你想学一口口齿不清的语言,你就不能真的错用Clojure


您可以在的答案中找到更多信息。

我假设Lisp指的是普通Lisp,因为“Lisp”本身更多地是一个语言家族(包括Clojure),而不是一种特定的语言。
有一些句法上的变化,Clojure是为了成为一个更现代的Lisp。例如,您可以使用[]s创建向量,使用{}s创建映射,这不是公共Lisp的一部分。当然,Java互操作不可避免地成为Clojure的重要组成部分。

我认为可以公平地说,如果您学习LISP的原则,您也将了解Clojure的原则,反之亦然。它们都植根于相同的哲学,强调以下内容:

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

  • 使用来表示数据和代码

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

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

除此之外,在语法、库、运行环境等方面也存在着很大的差异。我的观点可能与C+VC++相同,如果你知道一个好的,那么核心概念是熟悉的,但仍然有很多根本的不同。
请看这一点。

学习第一个Lisp时所学的90%内容将延续到下一个Lisp。

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

(.toString 10)-将调用数字10上的方法toString,但.toString不是函数。如果您尝试检查.toString的值,它会抛出一个异常,表明.toString不是已定义的符号


此外,对于准引号(主要是在宏中),Clojure没有像常见的lisp那样使用coma来表示unquote,而是使用tilde。

这是错误的。Lisp有很多语法。吨。以CL中的DEFCLASS、DEFSTRUCT、LOOP和其他语法为例进行检查。下面是s表达式的语法-这也不是很简单。为了清晰起见,Rainer,这是一个小点。他说“Lisp家族”。您使用的所有示例都是Common Lisp,我认为您给出的唯一有效示例是LOOP,这是唯一一种混合语法(关键字)而不是列表的形式。即便如此,请将您所有的示例与Scheme进行对比,Scheme几乎所有内容都是定义,您提到的结构都不存在。@Shaun:Scheme内置了语法关键字和宏。见计划报告。它以LET,LAMBDA,IF。。。不要混淆s表达式是Lisp语法。Lisp语法位于s表达式之上。Lisp通常有一个简单的函数调用形式。但是每个Lisp都有一些特殊的语法形式和一些宏。语言中已经存在的每个宏都实现语法。语法是语言的结构。用户定义宏是每个Lisp中具有用户可扩展语法的一种方式。“无语法”只是一个经常重复的神话。事实正好相反,我不同意。实际上,语法和语义的分离比一般人所理解的要困难得多,Clojure的语义与CLs非常不同。但是,即使我们只讨论比较语法有意义的地方——好吧,想象两种假设的语言,每种语言都有10条语法。现在想象一下,它们中有9个不同。事实上,他们仅仅在九点上有所不同,因为他们没有什么语法可以开始,但这并不意味着他们在语法上没有差异——你的语法越不重要,差异就越重要。我的观点可能不那么明智,那就是你可以有意义地比较Clojure的语法和CL的Clojure往往会赢。Lisps往往会让您对语法有相当大的控制,而CL比Clojure对语法有更多的控制,这一事实使情况变得复杂。Clojure和CL都有足够好的语法,它们的语义是否符合您的需要应该是最重要的关注点。我希望CL有Clojure用于映射/哈希表的文字语法,但这还不足以让我在CL明显更好的地方选择Clojure而不是CL。[]和{}保留给CL中的用户扩展。向量写为#(…)。该级别的字符语法可以由库提供,实际上是这样。也许CL是更现代的Lisp,因为语法是用户可扩展的,库可以使用[]和{}?Common Lisp通常被称为just Lisp。同样,Lisp通常意味着公共Lisp。Lisp族通常表示为Lisp,或Lisp。函数和宏之间有“一点”区别。函数是第一类的。宏不是。