宏
- 令 lisp 不同于其他语言的特性。
- 标准控制结构
- 定义新的句法抽象,不是像其他语言去创建新的函数抽象型或定义类的层次体系。
几个标准控制构造宏
- if
(if condition then-form [else-form])
如果 condition 是 nil 并且没有 else-form 则返回 nil
- when
抽象 if 后如果执行多条语句需要用 porgn 的细节。
// 自定义 when
(defmacro when (conditon &rest body)
`(if condition (progn @body)))
unless
与 when 类似,不过是取相反的条件。cond
类似其他语言中的 switch
(cond
(test-1 form*)
.
.
(test-n form))
//返回最后一个
- and/or
对任意多个表达式进行逻辑操作,返回 t 或 nil - not
逻辑反,严格来说不属于宏
循环
lisp 的 25 个操作符中没有循环,循环构建在一对提供原生 goto 机制 ( tagbody 和 go )的特殊操作符上。
- dolist
在一个列表的元素上循环,使用一个依次持有列表中所有后继元素的变量来执行循环体
(dolist (var list-form)
(body-form*)
//eg
(dolist (x `(1 2 3))
(print x)
可使用 return 在 dolist 中中中断循环
- dotimes
循环计数
(dotime (i 4) (print i))
//从 0 输出到 3
- do
可以绑定任意数量变量,变量改变方式可控,可以定义测试条件。功能特别强大。
(do (variable -definition*)
(end-test-form result-form*)
statement*)
每个 variable-definition 引入一个变量,单一变量定义为
(var init-form step-from)
是一个三元列表,每次迭代, step-from 重新求值赋值,不给出则不变。
init-form 是变量的初始值,不给出则为 nil 。
end-test-form 不为 nil ,迭代继续
返回 result-form 的最后一个值,可以省略。
所有的 step-from 在分配任何值给变量前被求指。
//例子,do 写的求10个斐波那契数列
(do ((n 0 (1+ n))
(cur 0 next)
(next 1 (+ cur next)))
((= 10 n) cur))
- loop (简易版)
(loop body-form*)
无线循环,直到 return 。