如果我们只是想使用 Lisp 试一下列表怎么处理、mapcar 怎么用,或者验证一个递归函数,为了十几行代码专门安装 Lisp 实现、配置编辑器,这样多少有点折腾。
而使用咱们绿叶网的 Lisp 在线编译器,就方便多了。我们打开网页就能写,运行完马上看结果,非常简单快捷。
页面上方就是咱们的 Lisp 在线编译器。界面非常直观:左边写代码,右边看结果。
Ctrl + Enter 快捷键。我们来跑个小例子试试:定义一个 square 函数,再用 mapcar 把列表里的数字都算一次平方:
(defun square (number)
(* number number))
(let ((numbers '(1 2 3 4 5)))
(format t "原始列表:~a~%" numbers)
(format t "平方结果:~a~%" (mapcar #'square numbers)))运行结果如下。
原始列表:(1 2 3 4 5)
平方结果:(1 4 9 16 25)像这种短小精悍的代码,最适合使用在线编译器来跑。写完直接看结果,不需要专门去建个本地项目。
Lisp 在线编译器最适合 “小代码、快验证”。尤其是刚开始接触 S 表达式和前缀写法时,光盯着书上的括号看容易把自己绕进去,自己写几行再跑一下反而直观得多。
其中,它主要适合用于以下场景:

Lisp 算是编程语言界真正的 “元老”,诞生于 20 世纪 50 年代末。它的名字来源于 “LISt Processor”(列表处理器),顾名思义,“列表” 从一开始就是它最核心的数据结构。
不过,现在我们常说的 Lisp,其实不是单指一门具体的语言,而是指一个庞大的语言家族。像 Common Lisp、Scheme、Clojure、Emacs Lisp 都是这个家族的成员。它们就像堂兄弟,底层理念一脉相承,但具体的语法细节和运行环境各有不同。
看一眼 Lisp 代码,你就能立刻认出它:满屏的括号、前缀写法(把操作符放在最前面,比如 (+ 1 2))。除了长相特别之外,Lisp 最核心的魔法在于 “代码即数据” 。这意味着你可以像处理普通数据一样去动态修改代码本身,这也是它拥有强大宏系统的根本原因。

既然 Lisp 是一大家子,那它们擅长的领域自然也是百花齐放。我们更应该看它能解决什么问题,而不是把它当成单一的工具:

第一次看 Lisp 代码,很多小伙伴会觉得这简直是 “括号开会” !其实这不是为了故意难为你,而是因为 Lisp 的代码逻辑非常的纯粹。
在很多语言里,我们会写 2 + 3。但在 Lisp 里,你要写成 (+ 2 3)。意思是:先指明你要做什么动作(加法),然后再给出参数(2 和 3)。
如果逻辑变复杂了呢?比如 “2 加上 3乘4”,直接套个括号就行:(+ 2 (* 3 4))。
发现了吗?括号的真正作用,是把 “谁先算,谁后算” 的结构明明白白地框出来。刚开始看可能有点晕,但习惯后我们会发现这种设计特别省心:不管多复杂的逻辑(运算、条件判断、循环),长得都一样。我们再也不用去死记硬背各种花里胡哨的语法和优先级了。

这是 Lisp 最有特色、也最有趣的一个概念。简单来说:Lisp 的代码本身,就是 Lisp 可以直接处理的数据(也就是列表)。
举个例子,(+ 1 2) 是一段代码,执行后会得到 3。但如果你告诉 Lisp “别执行它”,那它在程序眼里,就只是一个普通的数据列表:第一个元素是 +,第二个是 1,第三个是 2。
这就意味着,你可以用 Lisp 写一段程序,去像拼乐高一样,拆解、修改甚至自动生成另一段 Lisp 代码。这也是 Lisp 能够拥有极其强大的 “宏(Macro)” 功能的原因——如果你觉得现有的语法不够用,完全可以自己 “捏” 一个新语法出来。

不是一回事。准确地说,“Lisp” 不是单一的一门语言,而是一个语言家族的统称,就像 “猫科动物” 包含了狮子、老虎和豹子。
它们长得很像(都爱用括号),但代码通常不能直接互相复制。常见的有下面这几位家族成员:
所以,下次如果我们在网上抄了一段 “Lisp 代码” 却跑不通,别急着怀疑人生,先看看它到底是哪位家族成员。

代码写得多了以后,鼠标点来点去多少有点慢。Lisp 在线编译器还支持下面这些常用快捷键,小伙伴们先把几个高频的记住就够用了。
Ctrl + Enter:运行代码。Ctrl + Z:撤销、Ctrl + Y:重做。Ctrl + C:复制、Ctrl + V:粘贴。Ctrl + A:全选。Ctrl + X:剪切。Ctrl + /:注释或取消注释。Ctrl + Home:跳转到首行的行首。Ctrl + End:跳转到末行的结尾。其中最值得记住的还是 Ctrl + Enter。写完顺手一按就能运行,用来反复熟悉 Lisp 的括号结构和函数调用非常方便。