Lisp是一种计算机编程语言,由约翰·麦卡锡(John McCarthy)于1958年发明。“Lisp”这个名称是“List Processing”的缩写,具有表处理的意思…以上大概是公认的比较权威的介绍,网络上很多资料大概都是这么讲的。从这些信息中可以看出,Lisp应该是一种和C、Java类似的计算机编程语言,是一种和中文、英文等所谓自然语言不同的、用来给计算机编程的语言,这或许是大部分人对它的印象。然而,在学习Lisp的过程中,感受到了很多与编程语言常识相背的地方,产生了一些感想,本文就表达一些自己对Lisp的一己之见。
1. Lisp语言和方言
如果特指一种语言的话,“Lisp语言”指的应该1958那时John McCarthy发明的那个版本。但是,那个版本的Lisp应该已经停留在书本里了,接下来的几十年里,Lisp快速发展、演变,现代的各种Lisp跟最初的那个版本已经不能称为同一种语言了,只是看上去有点像,都是用包含括号的S-表达式来表示的,但是语言特性和实现已经是天差地别了。那么,现在所说的“Lisp语言”用来指代包含最初的Lisp及其衍生出来的各种方言(例如:Common Lisp,Scheme,Emacs Lisp)在内的一类语言比较合适。
你可能从未听过计算机方言,毕竟没有“C++方言”或者“Java方言”这样的说法,那是因为Java的某一版本明确定义了这个语言这个版本的所有语法,开发者并不能直接修改语法或添加语法。但是,Lisp语言由于提供了扩展词法、语法的功能(例如 Common Lisp 的宏和读取宏),使得Lisp语言的使用者可以给自己手头的Lisp实现添加很多自己想要的语言特性,这样就形成了大量方言,有一些可能连名字都没有。
Common Lisp 和 Scheme 是现在相对主流的两大Lisp方言,各自有着诸多的实现和衍生出来的方言。其余还有 Emacs Lisp、AutoLisp 也仍保持活跃,不过只适合特定环境特定场景,Emacs Lisp 仅用于Emacs编辑器中,而AutoLisp则内嵌于AutoCAD中。还有一些方言用于特定科研领域,在此不多介绍了。
虽说 Common Lisp 和 Scheme 是两大主流Lisp方言,但是并非具体的Lisp实现,仅仅是一种规范,而对应的具体实现也并非只有规范中规定的语言特性和API,通常都包含各自的扩展。下面列出一些常见实现和对应的官方主页(或项目地址)。个人比较推荐 SBCL 和 ChezScheme。
Common Lisp实现:
| 名称 | 官方主页 |
|---|---|
| Steel Bank Common Lisp (SBCL) | http://www.sbcl.org/ |
| GNU CLISP | https://clisp.sourceforge.io/ |
| Embeddable Common-Lisp (ECL) | https://ecl.common-lisp.dev/ |
| Armed Bear Common Lisp (ABCL) | https://www.abcl.org/ |
Scheme实现:
| 名称 | 官方主页 |
|---|---|
| Chez Scheme | https://scheme.com/ 或 https://cisco.github.io/ChezScheme/ |
| Racket | https://www.racket-lang.org/ |
| GNU Guile | http://www.gnu.org/software/guile/ |
2. Lisp的程序
谈论一门编程语言,没有程序示例,讲得再多也会显得空洞抽象。这一节就展示一下Lisp的程序大概是什么样子的。
首先,我们来看几个 hello world 例子:
- 示例 1. 打印5行helloworld
英语:
print 5 lines of "hello world"
Lisp:
(print 5 line "hello world")或(打印 5 行 "hello world")
- 示例 2. 字符串"hello world"
英语:
the string "hello world"
Lisp:
(the string "hello world")或#T(字符串 "hello world")
- 示例 3. John 说:“hello world”
英语:
"hello world," John said
Lisp:
(say by John "hello world")或#P(John say "hello world")或(John 说 "hello world")
看到这里,或许有人已经把上面的例子在Lisp实现中试了下,然后遇到了一堆错误。并不是我捉弄大家,上面那些确实可以作为Lisp语言的程序,不过缺少对应宏或操作符的实现。好了,言归正传,下面附上能运行几个简单示

最低0.47元/天 解锁文章
2145

被折叠的 条评论
为什么被折叠?



