Elisp 控制结构

Table of Contents

顺序执行

无法用 eval-last-sexp 同时执行两个表达式,这时就需要 progn 这个特殊表达式:

(progn A B C ...)

条件判断

elisp 有两个最基本的条件判断表达式 ifcond 。使用形式分别如下:

(if condition
    then
  else)

(cond (case1 do-when-case1)
      (case2 do-when-case2)
      ...
      (t do-when-none-meet))

使用的例子如下:

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

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

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

循环

循环使用的是 while 表达式。它的形式是:

(while condition
  body)

比如:

(defun factorial (n)
  (let ((res 1))
    (while (> n 1)
      (setq res (* res n)
            n (- n 1)))
    res))
(factorial 10)                          ; => 3628800