顺序执行

1
(progn A B C)

它的作用是让表达式 A,B,C 顺序执行,比如:

1
2
3
(progn
(setq foo 3)
(message "Square of %d is %d" foo (* foo foo)))

条件判断

if

形式:

1
2
3
4
(if condition
then
else)
)

示例:

1
2
3
4
(defun my-max (a b)
(if (> a b)
a b))
(my-max 3 4) ; => 4

cond

形式:

1
2
3
4
(cond (case1 do-when-case1)
(case2 do-when-case2)
...
(t do-when-none-meet))

示例:

1
2
3
4
5
6
(defun fib (n)
(cond ((= n 0) 0)
((= n 1) 1)
(t (+ (fib (- n 1))
(fib (- n 2))))))
(fib 10) ; => 55

还有两个宏 when 和 unless ,从它们的名字也就能知道它们是做什么用的。使用这两个宏的好处是使代码可读性提高,when 能省去 if 里的 progn 结构,unless 省去条件为真子句需要的的 nil 表达式。

循环

循环使用的是 while 表达式。

形式:

1
2
(while condition
body)

示例:

1
2
3
4
5
6
7
(defun factorial (n)
(let ((res 1))
(while (> n 1)
(setq res (* res n)
n (- n 1)))
res))
(factorial 10)