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

时间:2011-01-13 21:49:08

标签: clojure lisp common-lisp

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

5 个答案:

答案 0 :(得分:11)

没有很大的语法差异(主要是因为Lisp系列语言几乎没有没有语法),但在其他方面肯定存在差异。 Clojure有很多现代编程特性,特别适合高可伸缩性(演员,引用等),而这些特性在“经典”Lisp(例如Common Lisp)中并不存在。

Clojure是一种活跃的,得到很好支持的Lisp方言。如果你想学习一个Lisp,那么Clojure就不会出错。

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

答案 1 :(得分:6)

你在学习第一个Lisp时学到的东西的90%会延续到你的下一个。

答案 2 :(得分:3)

我认为公平地说,如果你学习了LISP的原则,你也会知道Clojure的原则,反之亦然。他们都扎根于同一个哲学,强调诸如以下的事情:

  • 代码就是数据。宏只是操纵代码的常规函数​​。

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

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

  • 使用一流功能进行功能编程。

除此之外,在语法,库,运行时环境等方面存在很多差异。我的观点差异可能与C#与C ++大致相同 - 如果你熟悉一个,那么核心概念将是熟悉的但仍存在许多根本差异。

请参阅此list of ways that Clojure is different from other Lisps

答案 3 :(得分:2)

我认为Lisp你的意思是Common Lisp,因为'Lisp'本身更像是一个语言系列(包括Clojure)而不是单一的特定语言。 有一些语法上的变化,Clojure旨在成为一个更现代的Lisp。例如,您可以使用[] s创建向量,使用{} s创建映射,这些映射不是Common Lisp的一部分。当然,Java互操作不可避免地成为Clojure的重要组成部分。

答案 4 :(得分:1)

Clojure使用向量作为lambda参数(参数值),但你可以编写一个宏 defun lambda ,在Common Lisp中看起来像这样。 Clojure还可以使用昏迷访问Java Object方法和文件,其名称看起来像普通函数调用

(。toString 10) - 将数字方法调用方法toString,但.toString不是函数。如果你试图检查.toString的值,它会抛出.toString未定义的符号。

并且在准引用中(主要在宏中)而不是昏迷Clojure使用tylda。