*其实我不会LISP,以下内容都是我瞎编的*
笑话一则:
一个间谍从NASA的主机盗取了一个用Lisp编写的核心程序,为了证明自己说的是真话,他打印出了程序的最后一页:
)))))))))))))))))))))))))))))
))))))))
))))))))))))))))))))))))))))))))))))))))
))))))))))))))))))))))))))))))))
一 形式(Form)
LIsp程序是由形式(Form)排列起来构成的。它通过以下规则进行求值。
1、符号(Symbol)会被解释为变量,求出该变量所绑定的值。
2、除符号以外的原子,则求出其自身的值。即:整数就是整数本身,字符串就是字符串本身。
3、如果形式为表,则头一个符号为函数名,剩余的元素为参数(这是CommonLisp等Lisp-2系列的Lisp中的行为)。
表示函数名的部分,还分为函数、特殊形式和宏三种类型。
1、函数在将参数求值后会被调用。
2、特殊形式相当于其他语言的控制结构,比如赋值 (setq n 10)。
3、Lisp中的宏,可以在对表达式求值时,通过对构成程序的表进行操作,从而改写程序本身。
二 求值
quote 操作符接受一个实参,并完封不动地返回它。
Common Lisp 定义 ' 作为 quote 的缩写。
三 输出
(format t "Hello, LISP~%")
(format t "~A plus ~A equals ~A. ~%" 1 2 3)
Hello, LISP
1 plus 2 equals 3.
(setq n 10)
(print n)
10
四 局部变量
(let ( (x 1) (y 2) )
(format t "x = ~A, y = ~A. ~%" x y))
(let ( (q 3) )
(format t "q = ~A. ~%" q))
x = 1, y = 2.
q = 3.
五 全局变量
(defparameter *glob* 99)
(defparameter *PI* 3.14)
(format t "glob = ~A, PI = ~A. ~%" *glob* *PI*)
glob = 99, PI = 3.14.
六 常量
(defconstant const *glob*)
(defconstant const2 123)
(format t "const = ~A, const2 = ~A. ~%" const const2)
const = 99, const2 = 123.
七 赋值
(setf *glob* 999999)
(let ((n 10)) (setf n 2) (format t "glob = ~A, n = ~A" *glob* n))
glob = 999999, n = 2
八 算数
(print (+ 2 3 4))
(let ((a 10))
(setf a (* a 3))
(print a))
9
30
九 分支
符号 t 表示真, nil 表示假,空表()也表示假。
函数listp:若参数是一个列表则返回真。
函数null:若参数是一个空表则返回真。
函数not:若参数是nil则返回真。
条件式if接受三个参数,一个test表达式、一个then表达式、一个else表达式。最后一个参数可以省略。
若test求值为 t,则对then表达式求值并返回该值,若为nil,则对else表达式求值并返回该值。
(if (> 2 3)
(print 2)
(print 3))
3
(print
(if (listp '(a b c))
(+ 1 2)
(+ 5 6)))
3
十 循环
do是最基本的迭代操作符
do的第一个参数是一组变量的初始化列表,每个元素是如下形式(variable initial update),表示变量名、初值、每次循环要做的操作。
第二个参数是一个或多个表达式,第一个表达式用来测试循环终止,其余的表达式依次求值,最后一个表达式作为do的返回值。
接下来的参数是循环体,每次循环依次执行。
(print
(do ((i 0 (+ i 1)))
((> i 10) 9999)
(print i)))
0
1
2
3
4
5
6
7
8
9
10
9999
十一 函数
defun来定义函数,通常接受三个以上的参数,第一个参数是函数名;第二个参数是一个列表,里面是函数接受的参数;第三个参数是表达式列表,即函数主体。