本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2024-06-18 15:45:19
Lisp 语言语法很简单:
(function arg1 arg2),表示以参数arg1、arg2等等调用函数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)))

鲁ICP备2025150228号