Lisp 语言及其解释器

· · 个人记录

Lisp 语言语法很简单:

这两种语法都是递归的,也就是说你可以随便嵌套。

可调用对象分两种:语言内置的与闭包。语言内置的,比如 +, read, write;闭包是自己定义的。

语法看起来很简陋,甚至连定义变量都好像做不到,但实际并不是这样。定义变量可以用 lambda 实现:

((lambda (x) (+ x 1)) 1) => 2,相当于 x = 1, x + 1

((lambda (x y) (+ x y)) 2 3),相当于 x = 2, y = 3, x + y

我们还可以利用闭包做到一些神奇的东西,比如构造链表:

((lambda (cons car cdr) (write (cdr (cons 1 2))))
(lambda (x y) (lambda (t) (if (= t 0) x y)))
(lambda (x) (x 0))
(lambda (x) (x 1)))

这类似于 C++ 中的:

pair cons (int x, int y)
{
    int helper (int t) { return t ? y : x; }
    return helper;
}

int car (pair x) { return x (0); }
int cdr (pair x) { return x (1); }

牛逼炸了。

还能递归,例如求阶乘:

(write ((lambda (this n) (if (= n 0) 1 (* n (this this (- n 1))))) (lambda (this2 n2) (if (= n2 0) 1 (* n2 (this2 this2 (- n2 1))))) (read)))

解释器