我知道它们是同一个语言家族的方言,称为 lisp,但究竟有什么区别?如果可能的话,您能否给出一个概述,涵盖诸如语法、特征、特性和资源等主题。
4 回答
他们都有很多共同点:
- 动态语言
- 强类型
- 编译
- Lisp 风格的语法,即代码被编写为 Lisp 数据结构(表单),最常见的模式是函数调用,例如:
(function-name arg1 arg2)
- 强大的宏系统,允许您将代码视为数据并在运行时生成任意代码(通常用于使用新语法“扩展语言”或创建 DSL)
- 常用于函数式编程风格,虽然有能力适应其他范式
- 强调使用 REPL 进行交互式开发(即您在代码的运行实例中进行交互式开发)
Common Lisp 的显着特点:
- 一个强大的 OOP 子系统(Common Lisp Object System)
- 可能是最好的编译器(根据http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.html,Common Lisp 是最快的 Lisp,尽管其中没有太多......)
Clojure 显着特点:
- 最大的库生态系统,因为您可以直接使用任何 Java 库
- 向量
[]
和地图{}
用作标准列表之外的标准()
- 除了向量和地图的一般有用性之外,有些人认为这是一项创新,通常更易读 - 更加强调不变性和惰性函数式编程,在某种程度上受到 Haskell 的启发
- 语言级别的软件事务内存支持的强大并发能力(值得关注: http: //www.infoq.com/presentations/Value-Identity-State-Rich-Hickey)
方案显着特点:
- 可以说是最简单易学的 Lisp
- 卫生宏(参见http://en.wikipedia.org/wiki/Hygienic_macro) - 优雅地避免了宏扩展中意外符号捕获的问题
上面的人错过了一些东西
Common Lisp 也有向量和哈希表。不同之处在于 Common Lisp 使用 #() 表示向量,而没有使用哈希表的语法。方案有向量,我相信
Common Lisp 有阅读器宏,允许您使用新的括号(Racket 也是如此,Scheme 的后代)。
Scheme 和 Clojure 有卫生的宏,而不是 Common Lisp 的不卫生的宏
所有的语言要么是现代的,要么有广泛的翻新项目。Common Lisp 在过去五年中获得了大量的库(主要归功于 Quicklisp),Scheme 有一些现代实现(Racket、Chicken、Chez Scheme 等),而 Clojure 是最近才创建的
Common Lisp 有一个内置的 OO 系统,尽管它与您可能使用过的其他 OO 系统完全不同。值得注意的是,它不是强制的——您不必编写 OO 代码。
这些语言有一些不同的设计理念。Scheme 被设计为理解 Actor 模型的最小方言;它后来被用于教学。Common Lisp 旨在统一大量涌现的 Lisp 方言。Clojure 是为并发而设计的。因此,Scheme 以简洁和优雅而著称,Common Lisp 以强大且与范式无关(函数式、OO 等)而著称,而 Clojure 则以支持函数式编程而著称。
不要忘记 Lisp-1 和 Lisp-2 的区别。
Scheme 和 Clojure 是 Lisp-1:
这意味着变量和函数名称都驻留在同一个命名空间中。
Common Lisp 是 Lisp-2:
函数和变量有不同的命名空间(其实 CL 有很多命名空间)。
Gimp 是用 Scheme 编写的 :)
事实上,一些人认为可能用 C++ 编写的软件的分配可能是在 Lisp 的保护伞下完成的,很难从一堆中挑选出金苹果。事实上,C++ 并不总是很流行,它只是在今天才流行起来,因为它有更新的历史。在本世纪下半叶,C++ 甚至没有使用多线程,它是 Python 今天成为无用的未经测试的错误胶水代码的污水池的地方。快进一点,现在我们看到函数式编程的兴起,它更像是适应或死亡。我认为就适配部分而言,Java 是正确的。
Scheme 旨在简化 Lisp 语言,这是它的唯一目的,只是它从未真正流行起来。我认为 Clojure 做了类似的事情来简化 JVM 的方案。就像其他所有 JVM 语言一样,它只是为了提升用户体验,只是为了简化 Java 领域的编写样板。