问题

对 Lisp 新手来说,学习哪种方言、使用哪些参考书和开发软件更适合?

回答
对于 Lisp 新手来说,选择一种方言、合适的参考书和开发软件是开启 Lisp 之旅的关键。下面我将详细介绍如何做出选择,并提供一些建议。

选择一种 Lisp 方言

Lisp 家族非常庞大,但对于新手来说,有几个主流且易于入门的方言:

1. Scheme

特点:
简洁优雅: Scheme 以其极简的设计哲学而闻名。它拥有非常小的核心语言集,但功能强大。
递归是核心: 很多 Scheme 程序都是围绕递归来设计的,这有助于培养函数式编程的思维方式。
强大的宏系统: 尽管核心语言精简,但 Scheme 的宏(macros)系统非常强大,允许你扩展语言本身。
清晰的语义: 状态(state)和副作用(side effects)在 Scheme 中通常被刻意减少,使得代码更容易理解和推理。
广泛用于教育: 许多大学的计算机科学入门课程会使用 Scheme 来教授编程基础、数据结构和算法。
适合新手的原因:
易于上手: 由于其简洁性,新手可以更快地掌握基本概念。
培养良好编程习惯: 强调函数式编程和避免副作用有助于建立扎实的编程基础。
社区支持好(教育领域): 在学术界和教育资源方面,Scheme 有很好的支持。
缺点:
在工业界的应用不如 Common Lisp 广泛。
某些版本的 Scheme(如 R5RS)可能在某些方面略显陈旧,但 R6RS 和 R7RS 提供了更现代的特性。
推荐的 Scheme 方言:
Racket: 这是一个非常现代且功能齐全的 Scheme 实现,它不仅仅是一个 Scheme 方言,更是一个完整的编程语言和开发环境。Racket 拥有丰富的库,包括图形界面、网络编程、语言设计等。它的文档非常出色,社区活跃,对新手非常友好。我强烈推荐 Racket 作为新手的第一选择。

2. Common Lisp

特点:
功能丰富且标准化: Common Lisp 是一个高度标准化(ANSI Common Lisp)的 Lisp 方言。它包含了大量内置函数和数据结构,非常适合开发大型、复杂的应用程序。
强大的宏系统: Common Lisp 的宏系统非常强大且灵活,被认为是 Lisp 的核心优势之一。
面向对象编程 (CLOS): Common Lisp 拥有一个非常强大和灵活的面向对象系统(Common Lisp Object System),它支持多重派发(multiple dispatch)等高级特性。
交互式开发: Common Lisp 强调 REPL(ReadEvalPrint Loop)驱动的开发流程,允许你在运行时修改和测试代码,这是一种非常高效的开发方式。
广泛的应用: 在工业界,尤其是一些有历史的项目和对生产力要求高的领域,Common Lisp 仍有应用。
适合新手的原因:
一步到位: 如果你的目标是学习一门能够用于实际项目开发的 Lisp 方言,Common Lisp 是一个不错的选择。
了解 Lisp 的强大之处: 通过 Common Lisp,你可以更直观地感受到 Lisp 语言的灵活性和宏的威力。
缺点:
学习曲线相对陡峭: 相较于 Scheme,Common Lisp 的语言特性更多,概念也更复杂一些,初学者可能会感到有些“杂乱”。
工具链可能不如 Racket 一体化: 虽然有很多优秀的 Common Lisp 实现和工具,但可能需要自己组合配置。
推荐的 Common Lisp 实现:
SBCL (Steel Bank Common Lisp): 这是目前最流行、性能最好、最接近标准的 Common Lisp 实现之一。它提供了快速的编译器和良好的调试支持。

3. Clojure

特点:
运行在 JVM 上: Clojure 是一个现代的 Lisp 方言,运行在 Java 虚拟机(JVM)上。这意味着它可以无缝地利用 Java 生态系统中的大量库。
函数式编程为核心: Clojure 强力推崇不变性(immutability)和纯函数(pure functions),这有助于编写更健壮、易于并发的代码。
强大的并发模型: Clojure 内置了对并发编程的支持,例如软件事务内存(STM)和原子操作(atoms),使得处理并发任务更加容易。
简洁的语法: 尽管是 Lisp 的一个分支,Clojure 的语法也进行了一些调整,例如使用方括号 `[]` 表示向量,花括号 `{}` 表示映射(hash map),使得其在数据结构表示上更接近某些现代语言。
元编程(Macros): 同样拥有强大的宏系统。
适合新手的原因:
现代化的特性: 如果你熟悉 Java 或其他现代编程语言,并且对函数式编程和并发感兴趣,Clojure 可能是一个不错的选择。
强大的生态系统: 能够利用 Java 的库是一个巨大的优势。
活跃的社区: Clojure 社区非常活跃,有很多优秀的库和工具。
缺点:
非传统 Lisp 语法: 对于一些坚持传统 Sexpression 语法的 Lisp 爱好者来说,Clojure 的一些语法变动可能不那么“Lisp”。
启动时间: 作为运行在 JVM 上的语言,Clojure 的启动时间可能比原生编译的语言要长一些。
推荐的 Clojure 开发环境:
Leiningen: 这是 Clojure 项目管理和构建的常用工具。

总结一下,对于新手:

如果想以最简单、优雅的方式入门编程思想和函数式编程,并且获得一个一体化的优秀开发环境,请选择 Racket (Scheme)。
如果想学习一门功能全面、能够用于大型项目的 Lisp 方言,并且不介意稍微陡峭的学习曲线,请选择 Common Lisp (SBCL)。
如果你熟悉 Java 生态,对函数式编程和并发感兴趣,并且想尝试一种现代化的 Lisp,请选择 Clojure。

考虑到“新手”这个词,我个人最倾向于推荐 Racket。

推荐的参考书

选择书籍取决于你选择的 Lisp 方言。

对于 Racket (Scheme)

1. 《How to Design Programs (HtDP)》 (或称《PnP》 Programming and Planning):
中文名: 《程序设计方法》
作者: Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, Daniel P. Friedman
为什么推荐: 这是我强烈推荐给所有 Lisp 新手的首选书籍。 它不直接教你“如何写 Racket”,而是通过一系列循序渐进的“定义测试函数”模式,教你如何进行程序设计。它使用 Scheme(Racket 是一个现代化的 Scheme),从最基础的程序概念开始,逐步引入更复杂的概念,如数据抽象、递归、高阶函数、状态管理等。它真正教会你“如何思考如何编程”。这本书有免费的在线版本。
在哪看: [https://htdp.org/](https://htdp.org/) (有多种语言版本,包括英文和中文部分章节的翻译)

2. 《Realm of Racket: Write Amazing Programs with Code that Writes Code》:
作者: Ryan Culkin
为什么推荐: 这本书更专注于 Racket 的特性和它的强大之处,尤其是宏(macros)。它会让你看到 Racket 不仅仅是一个 Scheme,它是一个拥有强大语言扩展能力的平台。这本书的例子很有趣,而且会引导你构建出一些实际的、令人印象深刻的程序。它比 HtDP 更进一步,让你深入了解 Racket 的“魔法”。
在哪看: 有付费的电子书和纸质书。

对于 Common Lisp

1. 《Practical Common Lisp (PCL)》:
作者: Peter Seibel
为什么推荐: 这是 Common Lisp 新手的经典入门书籍。 它直接切入主题,教你如何使用 Common Lisp 来构建实际的应用程序。它涵盖了从基本语法到 CLOS、数据库访问、Web 开发等广泛内容。这本书的特点是实用性强,边学边练,能让你很快地感受到 Common Lisp 的开发效率。这本书也是免费在线阅读的。
在哪看: [http://www.gigamonkeys.com/book/](http://www.gigamonkeys.com/book/)

2. 《Common Lisp: A Gentle Introduction to Symbolic Computation》:
作者: David S. Touretzky
为什么推荐: 这本书更侧重于 Lisp 的基础概念和符号计算的原理,类似于 Scheme 的教育方法,但更偏向于 Common Lisp 的风格。它会深入讲解 Lisp 的数据结构(如列表)和递归,并给出许多经典的例子(如符号微分、游戏 AI)。它能帮助你建立对 Lisp 核心思想的深刻理解。
在哪看: 可以搜索找到免费的 PDF 版本,但要注意其标准可能略旧(主要基于 ANSI Common Lisp)。

3. 《Land of Lisp: Learn Web Development, Game Development, and Embeddable Extendable Software With Common Lisp》:
作者: Conrad Barski
为什么推荐: 如果你想通过有趣的项目来学习 Common Lisp,这本书绝对是首选。它教你如何用 Common Lisp 开发游戏(比如一个在终端里玩的射击游戏)、构建 Web 应用甚至一个可以嵌入和扩展的软件。它能让你感受到 Lisp 的强大和趣味性。
在哪看: 有付费的电子书和纸质书。

对于 Clojure

1. 《Clojure for the Brave and True》:
作者: Daniel Higginbotham
为什么推荐: 这是 Clojure 新手的绝佳起点。 它以一种幽默、富有启发性的方式介绍 Clojure。它从零开始,逐步讲解 Clojure 的核心概念、函数式编程原则以及如何使用 Clojure 来解决实际问题。它鼓励读者动手实践,并且会让你爱上 Clojure。这本书也是免费在线阅读的。
在哪看: [https://www.braveclojure.com/](https://www.braveclojure.com/)

2. 《Clojure in Action》:
作者: Alex Miller
为什么推荐: 这本书更深入地探讨了 Clojure 的高级特性和实际应用,包括并发、状态管理、数据处理等。如果你已经掌握了 Clojure 的基础,并想了解如何用它构建生产级的应用程序,这本书是很好的选择。
在哪看: 有付费的电子书和纸质书。

开发软件 (IDE/编辑器和工具)

Lisp 的开发体验非常依赖于良好的工具支持,尤其是与 REPL 的集成。

对于 Racket

DrRacket:
是什么: DrRacket 是 Racket 官方提供的集成开发环境(IDE)。它是一个跨平台的应用程序,非常用户友好,专为 Lisp 和 Racket 设计。
为什么推荐:
开箱即用: 安装 Racket 就会附带 DrRacket,无需额外配置。
强大的 REPL 集成: REPL(交互式求值器)是 Lisp 开发的核心。DrRacket 的 REPL 非常出色,可以直接在里面输入代码并立即看到结果。
代码检查和调试: 它有语法高亮、自动补全、错误提示,以及一个强大的图形化调试器,可以让你一步步跟踪代码执行。
语言级别支持: DrRacket 可以让你选择不同的 Scheme 或 Racket 语言版本(如 R5RS, R6RS, Racket),并根据所选语言进行代码检查和提示。
文档浏览器: 集成了 Racket 的文档系统,方便随时查阅函数和库的说明。
模块化开发: 支持项目的管理和构建。
如何获取: 从 Racket 官网下载并安装即可。 [https://racketlang.org/](https://racketlang.org/)

对于 Common Lisp

Common Lisp 的开发环境更加多样化,通常是编辑器 + Lisp 实现 + REPL。

1. 编辑器/IDE:
Emacs + SLIME/Sly:
是什么: Emacs 是一个极其强大和可高度定制的文本编辑器。SLIME (Superior Lisp Interaction Mode for Emacs) 和 Sly 是 Emacs 中用于与 Common Lisp REPL 集成的插件。
为什么推荐: 这是许多 Lisp 程序员的首选开发环境。Emacs 本身就是一个强大的编程环境,通过 SLIME/Sly,你可以获得无与伦比的 Lisp 开发体验:
无缝 REPL 集成: 可以在 Emacs 中直接运行代码片段,查看结果,导航到定义。
代码补全和自动提示: 智能的代码补全,根据上下文提供建议。
文档即时查询: 直接在编辑器中查询函数文档。
调试器集成: 强大的交互式调试功能。
高度可定制: 你可以根据自己的喜好调整一切。
如何获取:
首先安装一个 Common Lisp 实现(推荐 SBCL)。
安装 Emacs。
在 Emacs 中安装 ELPA/MELPA 包管理器,然后搜索并安装 `slime` 或 `sly`。
配置 Emacs 以便它能找到并启动你的 Common Lisp 实现。这通常涉及到在你的 Emacs 配置文件 (`.emacs` 或 `init.el`) 中添加一些配置代码。网上有很多关于如何配置 SLIME/Sly 的教程。

VS Code + Extension:
是什么: Visual Studio Code 是一个流行的现代代码编辑器。它也有相应的插件来支持 Common Lisp 开发。
为什么推荐: 如果你已经熟悉 VS Code,这是一个相对容易上手的选择。VS Code 的插件可以提供基本的语法高亮、代码补全、错误检查和与 REPL 的集成。
如何获取:
安装 Common Lisp 实现(推荐 SBCL)。
安装 VS Code。
在 VS Code 的扩展市场中搜索并安装与 Common Lisp 相关的插件,例如 `Common Lisp Language Server` (提供 LSP 支持),以及 REPL 集成插件。

LispWorks / Allegro CL (商业 IDE):
是什么: 这些是历史悠久的商业 Common Lisp 实现,它们提供了非常完整的集成开发环境,包括强大的图形化 IDE、调试器、性能分析工具等。
为什么推荐: 如果你追求极致的集成开发体验并且预算充足,可以考虑。但对于新手来说,它们可能显得有些庞大和复杂。

2. Common Lisp 实现:
SBCL (Steel Bank Common Lisp): 如前所述,这是目前最推荐的 Common Lisp 实现。它性能好,接近标准,并且有很好的社区支持。
CCL (Clozure CL): 另一个不错的实现,也提供良好的性能和特性。

3. 项目管理工具:
Quicklisp:
是什么: Quicklisp 是一个 Common Lisp 的库管理器和依赖管理器。它使得安装和加载第三方库变得非常简单。
为什么推荐: 几乎所有的 Common Lisp 项目都会使用 Quicklisp 来管理依赖。它极大地简化了第三方库的使用,让你可以专注于编写自己的代码,而不是处理复杂的库安装过程。
如何获取: 从 Quicklisp 官网下载并运行其安装脚本即可。 [https://www.quicklisp.org/beta/](https://www.quicklisp.org/beta/)

对于 Clojure

1. Leiningen:
是什么: Leiningen 是 Clojure 的首选项目构建和依赖管理工具。它处理项目创建、编译、测试、部署等任务。
为什么推荐: 几乎所有 Clojure 项目都使用 Leiningen。它使得项目管理变得标准化和便捷。
如何获取: 从 Leiningen 官网下载并安装。 [https://leiningen.org/](https://leiningen.org/)

2. 编辑器/IDE:
Emacs + CIDER:
是什么: CIDER (Code Inference, REPL, and Debugging) 是 Emacs 中用于 Clojure 开发的顶尖插件。它提供了与 Clojure REPL 的深度集成。
为什么推荐: 和 SLIME/Sly 一样,CIDER 在 Emacs 中提供了非常强大的 Clojure 开发体验,包括代码补全、REPL 集成、代码导航、调试等。如果你是 Emacs 用户,这是必选。
如何获取: 在 Emacs 中通过 MELPA 安装 `cider`。

VS Code + Calva:
是什么: Calva 是 VS Code 中最受欢迎的 Clojure 开发插件。它提供了出色的 REPL 集成和开发体验。
为什么推荐: 如果你喜欢 VS Code,Calva 是一个非常好的选择。它能让你在 VS Code 中获得接近原生 Clojure IDE 的体验。
如何获取: 在 VS Code 的扩展市场中搜索并安装 `Calva`。

IntelliJ IDEA + Cursive:
是什么: Cursive 是一个强大的 IntelliJ IDEA 插件,为 Clojure 开发提供了全面的支持,包括代码智能、调试、测试运行等。
为什么推荐: 如果你习惯使用 IntelliJ IDEA,并且想要一个功能非常全面的、接近商业级 IDE 的体验,Cursive 是一个优秀的选择。它虽然是付费插件,但提供了免费的试用期。

学习建议

1. 从小处着手,循序渐进: 不要试图一口气学完所有东西。从最基础的语法、数据类型和控制结构开始。
2. 拥抱 REPL: Lisp 的 REPL 是你最好的朋友。多在 REPL 中尝试代码,观察结果,理解它是如何工作的。
3. 多动手实践: 阅读书籍和教程固然重要,但更重要的是亲手编写代码。尝试解决一些小问题,或者实现书中的例子。
4. 理解 Sexpression (表达式): Lisp 代码本身就是一种数据结构(列表),理解 Sexpression 的结构是理解 Lisp 的关键。`(function argument1 argument2)` 是基本模式。
5. 学习宏: 宏是 Lisp 的核心优势之一,它允许你扩展语言本身。一开始可能会觉得难以理解,但一旦掌握,你就能体会到 Lisp 的强大之处。
6. 加入社区: Lisp 社区通常非常友好和乐于助人。在遇到问题时,不要害怕提问。可以关注相关的论坛、邮件列表或聊天群组(如 Reddit 的 r/lisp, r/scheme, r/Clojure)。
7. 不要害怕递归: Lisp heavily relies on recursion. 练习写递归函数,理解它们的工作原理。
8. 尝试用不同的方式解决问题: Lisp 的灵活性允许你用多种方式来表达同一个想法。尝试不同的实现,找出最简洁、最清晰的方案。

我的最终建议给 Lisp 新手:

1. 选择 Racket 作为起点。 它的学习曲线平缓,文档完善,工具链优秀,非常适合培养良好的编程思维。
2. 阅读《How to Design Programs》并跟着实践。
3. 使用 DrRacket 作为开发环境。

等你对 Lisp 的基本概念有了深入理解后,如果你对函数式编程、并发或在 JVM 上开发感兴趣,可以再去探索 Clojure。如果你对构建大型系统、面向对象以及更传统的 Lisp 哲学感兴趣,可以尝试 Common Lisp。

祝你在 Lisp 之旅中学习愉快!

网友意见

user avatar

不好意思,经常改动影响大家的timeline,我只是想让这个答案更完美一些……下面是正文

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Common Lisp和Scheme是Lisp家族的两大主要方言,通用性比较好,ELisp和AutoLisp只能在特定的环境下使用,所以不推荐。


如果你只是想学习FP的思想,可以直接学习Scheme,FP的思想都有了,还比较简单,只不过库不太完备。如果追求CL的强大可以看看Racket,是PTL Scheme的进化版。

IDE推荐:

  • DrRacket

书籍推荐:

  • Teach Yourself Scheme Mit Press
  • Simply Scheme MIT Press
  • LISP in small pieces
  • r5rs

基本都有电子版,第三个Lisp in small pieces不能作为入门教程,它默认你已经学会了Scheme,并且着重讲如何实现一个Scheme的解释器或者编译器以及一些比较深层次的概念,不太好懂但是很开阔思路,而且经常将Scheme和CL进行对比,使你能够触类旁通。最后一个是Scheme的规范,也不适合作为入门教程,更适合作为reference,虽然它比较薄只有几十页。如果英文不太好,可以看看网上有没有中文版。


不过相对来说我还是推荐Common Lisp,原因三言两语也说不清,比较正统的Lisp,工业化程度高,如果你看过《黑客与画家》应该有所了解,但是缺点是学习难度大,虽然大家都说CL久经历练,但是糟粕也不少,这些别人说了没用,只有你学完了之后做两个项目才有体会。不过总起来说还是一门非常伟大的语言。首先由Lisp引进的编程思想包括if/then/else控制结构、递归函数调用、动态内存分配、垃圾收集、高阶函数、词法闭包、交互式编程、增量编译以及动态类型……

IDE推荐:

  • Lisp in a box
  • LispWorks(适合高薪阶层)

书籍推荐:

  • Practical Common Lisp
  • ANSI Common Lisp

我当初就是利用这两本书学习的,不过在学习过程中主要还参考了

  • Lisp Quick Reference
  • Common Lisp The Language

第一本参考用公式的方式把基本用法列出,基本上覆盖了整个ANSI Common Lisp标准,但是可能比较晦涩,不过习惯了就好了。第二本就不说了,类似牛津词典,一千多页,不懂的查查就行了,一般人看不下来,看下来也没啥意思。

当你读过这些书之后,基本上已经对Lisp有一个较深的了解,这时你可以自己写个项目练练手,或者直接到github上clone一个。另外还有些书不错,但是因为你已经有了比较扎实的基础,你可以随便看看,没必要像看课本那么仔细:

  • On Lisp(与Common Lisp The Language同一作者,相当于CLTL的进阶版)
  • Common Lisp A Gentle Introduction to Symbolic Computation
  • Land of Lisp(好多漫画!)
  • Successful Lisp
  • Tutorial on Good Lisp Programming Style
  • The Art of the Metaobject Protocol

这些书除了最后两本我都看得不是很仔细,因为很多和Practical Common Lisp、On Lisp有重复,所以我只是看一些有特点的部分。倒数第二本讲的是如何养成良好的Lisp编程风格,你可以当成散文来读。最后一本比较深,我也没有看完,主要讲的是CLOS相关的东西,可以用来开阔思路。



其实如果你想学习CL这门语言,这些足足足足足足够了,但是你还是觉得很无聊,好吧,再推荐两篇文章:

  • The Roots of Lisp
  • Recursive Functions of Symbolic Expressions and Their Computation by Machine Part I

建议把这两篇文章打印出来,一行行的看!一是因为都比较短,花不了你多少钱,二是因为都值得反复推敲,不是看一遍就扔了。第一篇文章是Paul Graham写的,就是那个ANSI Common Lisp、On Lisp以及Hackers & Painters的作者,主要内容是对第二篇论文的总结概括,探讨了Lisp的根基理论,难度较小,一共就十几页,看完了会有一些新的收获,这些是你看其它语言教程看不来的。第二篇我就不说了,Lisp的作者写的,好好看下,想想作者是如何设计出这样一门伟大的语言的,别说你数学不好,你不会学呀,再说这里用的数学也不难。


另外我不太清楚你学习Lisp的目的,上面说的可能比较适合一般的程序员,如果你是AI研究者你可以直接看下面的两本:


  • Paradigms of Artificial Intelligence Programming,Case Studies in Common Lisp
  • The Elements Of Artificial Intelligence(An Introduction Using Lisp)

另外经常有初学者希望我推荐一些适合Lisp学习的网站,我就把我经常用的网站贴一下:




如果大家想看到持续更新的资源,可以在我的github上找“Lisp学习之路.md”


jiangxincode/cnblogs: 一些我平时会发表到cnblogs的文章

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

好了,我把我知道的都交代了,希望你们别到处问这个问那个,不踏实学习!老老实实看书才是王道呀!!!!

另外只看不点赞是什么心态呀!!!!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有