通往Lisp的道路:选择哪种Lisp
大多数编程语言作为单一语言不断发展。Python、Java、JavaScript、C++都有新版本和标准,以及多种实现,但它们仍然保持同一种语言。C和C++可以用GCC或Clang编译,Python可以用CPython或PyPy编译,JavaScript在Firefox和Chrome中运行相同,而Java程序可以在JVM或GraalVM上运行。然而,Lisp并非如此。Lisp标志,NASA版本。维基百科页面列出了20多种不同的方言,这意味着有很多变体可供选择。这是因为Lisp是一类编程语言的集合。它们共享相同的基本语法,但在其运算符、语义、标准库和语言能力上有所不同。Lisp初学者的主要担忧之一是应该首先学习哪种方言。我在在线论坛上经常看到这个问题。答案是方言确实重要,但并不像初学者想象得那么重要。学习Lisp是关于学习一种新的编程类型。以新的方式使用代码思考问题。您将通过任何方言学习基本概念。然后,一旦您学会了一种,转向另一种就会相对容易。我将简要介绍一些实际上被广泛使用和维护的相关方言。我会尝试突出它们的优缺点,以帮助您克服犹豫不决,并选择一种开始您的Lisp之旅。如果您是初学者,这篇文章中的许多概念对您来说可能是完全新的。您不必太担心这些。当我还是初学者时,我发现许多这些概念很吸引人,这促使我进一步了解Lisp世界。普通Lisp简称CL,它是所有Lisp方言中最成熟、最全面的。它被认为是“老派Lisp”,因为该语言——从现在开始我将称其为语言——在1994年通过正式的ANSI规范实现了标准化。由于这一标准化,现在有多个针对不同平台和用例的Common Lisp实现。其中最著名的实现是SBCL,它直接编译为本机代码。它快速、开源,并且与现代硬件兼容。使用它时,写得好的Common Lisp代码可以达到与C和Rust相当的性能。因为SBCL进行了大量优化,它的编译速度比其他实现稍慢,但生成了一些在Lisp家族中最快的代码。阴阳普通Lisp标志。希腊字母λ(lambda)指的是阿隆佐·丘奇发明的λ演算。当我之前提到Common Lisp是最全面的方言时,我的意思是它在所有Lisp中提供最广泛的功能集。它提供大量的开箱即用功能,其许多内容都是直接在标准中定义的。例如,CL有控制编译和评估的函数(COMPILE、LOAD、EVAL、COMPILE-FILE等),这意味着我可以在我的代码或REPL中使用这些函数告诉Lisp进程编译一个函数、加载一个文件或评估一些代码。CL还提供DISASSEMBLE,您可以检查为编译函数生成的机器代码。Common Lisp有条件和重启系统,这是我见过的最强大的调试和检查程序的方式之一。如果在执行过程中发生条件,Lisp进程可能会停止,并让您检查此时程序及其变量的状态。然后,您可以选择重启程序并重新尝试操作,或者忽略条件并继续执行。这也是可能的,因为Common Lisp REPL与运行的系统深度集成。如果您的程序在远程服务器上失败,您可以连接到其REPL并检查实时进程以了解出错的原因。Common Lisp支持所有主要编程范式,如函数式、命令式、元编程和面向对象编程。它提供了一个最先进的对象系统,称为CLOS,支持多重分发和通用函数等特性。这使得面向对象编程比常见的面向对象语言(如Java或C++)更灵活。此外,值得注意的是,Common Lisp是动态类型的,但具有丰富且表达性强的类型系统,支持可选的类型声明。标准化意味着语言是稳定的。1994年的ANSI Common Lisp仍然是目前使用的版本。正因为如此,Lisp程序员很少会受到向后不兼容的影响,而旧的Common Lisp代码往往今天仍然能完美运行。例如,如果您查阅1991年由彼得·诺维格出版的旧Lisp书籍《PAIP》,您会发现其中许多代码仍然可以在现代实现中运行。使用Common Lisp,您遇到的向后不兼容问题远少于Ruby和Python等语言。即使是最近没有更新的Common Lisp库,通常仍然能够在您的系统上正常运行,因为它们不需要不断适应新版本。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡