Logo ryp 的博客

博客

Lisp 语言及其解释器

...
ryp
2025-12-01 12:50:22
She's not square

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2024-06-18 15:45:19

Lisp 语言语法很简单:

  • (function arg1 arg2),表示以参数 arg1arg2 等等调用函数 function;例如:(+ 1 2)(write (+ 2 3))

  • (if cond body alter),是判断语句,当 cond 不为零时执行 body,否则执行 alter

  • (lambda args body),生成一个闭包,也就是通常说的函数,args 是参数,body 是语句。例如,(lambda (x y) (+ x y))(lambda (x y) (lambda (t) (if (= t 0) x y)))

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

可调用对象分两种:语言内置的与闭包。语言内置的,比如 +, 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)))

解释器

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。