1

我最近发现,如果遵循 Common Lisp 标准,我可以在学校的函数式编程课程中使用任何 Lisp 方言。Clojure 是否遵循此标准?是不是太不一样了?

4

4 回答 4

16

Clojure 不遵循 Common Lisp 标准——它是一个全新的 Lisp。

话虽如此,它与 Common Lisp 共享很多东西,因此从其中获得的知识将普遍适用于另一个。

许多关键的事情是相同的:

  • 通过将函数放在列表的开头,后跟其参数来应用函数:(my-function arg1 arg2)
  • “代码就是数据” - 代码以同音形式表示,也是 Lisp 数据结构
  • 两者都有强大的宏系统——你可以编写函数来生成任意代码
  • 它们是动态语言,
  • 两者都强调使用REPL进行交互式开发
  • 它们通常都是编译的

一些不同的东西:

  • Clojure 更加强调函数式编程——所有数据结构都是不可变的,核心库主要由“纯”函数组成。注意:你仍然可以在 Common Lisp 中使用函数式风格,Clojure 只是把它放在最前面
  • Clojure 是Lisp-1(就像 Scheme 函数和数据共享相同的命名空间),而 Common Lisp 是Lisp-2(函数和数据具有不同的命名空间)
  • 除了传统的 Lisp 列表之外, Clojure 还为地图、向量和集合提供了新的文字{}[]#{}()
  • Common Lisp 支持阅读器宏- 这使您能够更好地自定义语言的语法
  • Clojure 有一种通过 STM管理并发、身份和状态的新方法 - 请参阅http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
  • Clojure 旨在“拥抱主机平台”(通常是 JVM,但也包括 CLR,最近人们对通过 ClojureScript 定位 JavaScript 产生了很大兴趣)——从实际的角度来看,这很重要,因为它可以让您访问一个巨大的一系列库/工具。
  • 没有Clojure 标准——它是一种BDFL 驱动的语言,具有一个主要的开源实现。Rich Hickey 是 BDFL 非常有帮助——他是个天才。

主观意见:我有偏见,但我认为对于大多数现代用途来说,如果你现在选择 Lisp,Clojure 绝对是要走的路——它是对 Lisp 的现代重新设计,拥有一个充满活力和创新的社区,是一个务实的选择“把事情做好”。

于 2012-11-18T10:01:17.783 回答
4

您不需要使用Common Lisp的方言。Common Lisp 有很多优秀的实现——这些实现为完整的 Common Lisp 提供了很多扩展。

对于使用 Lisp 进行教育编程,我会推荐SBCL,它提供了出色的编译器。CCL(Clozure Common Lisp)是另一个不错的选择。两者都在 Linux 和 Mac OS X 上运行得特别好。

有 Common Lisp 的方言(例如用于开发 Cyc,一个基于知识的大型系统的 SubL)和与 Common Lisp 相关的语言(例如 AutoCAD 的 Visual Lisp,GNU Emacs 或 ISLisp 的 Emacs Lisp),但它确实在教育中使用它们是没有意义的。标准的 Common Lisp 实现存在很多,而且它们非常出色。

Clojure甚至不是 Common Lisp 的方言,它是一种不同的语言。

于 2012-11-18T10:14:06.103 回答
2

Clojure 是它自己的语言——不是 Common Lisp 语言的实现。所以它不遵循 Common Lisp 标准。

于 2012-11-18T09:45:29.497 回答
1

我认为您的教授的意思是一些 Common Lisp 实现添加了许多不属于标准的额外功能,而您的教授不希望您使用这些功能。所以选择你喜欢的任何 Common Lisp 实现,比如 SBCL 或 Clozure 等,并且只使用不是该特定实现独有的实际 Common Lisp 函数、技术等。换句话说,您编写的代码理论上应该可以在任何 Common Lisp 实现上运行。

Clojure、Scheme 等是 Lisp 的其他方言,它们有自己的标准(如果适用,“标准”这个词根据你的意思有不同程度的严格性),与 Common Lisp 不同。也就是说,他们当然不遵守 Common Lisp 标准。

坦率地说,当谈到 Lisp 语言时,“方言”通常指的是完全不同的 Lisp 语言,它与另一种方言的标准不同。因此,说“Common Lisp 的不同方言”是没有意义的。但是,您可以说“Lisp 的不同方言”。

于 2013-12-30T13:14:19.547 回答