quote ##
特殊操作符,接受单一表达式并返回
等同于符号” ` “
(quote (+ 1 2)) 等同于
`(+ 1 2)
与 list 的区别:
(quote (a b)) //两个符号本身的表
(list (a b)) //两个值得表
setf 宏
通用赋值操作符
(setf variable value)
是宏,不是特殊操作符,可以检测所赋值的 variable 的形式,并展开成适当的底层操作来修改那个位置。
当该位置是变量时,它展开成一个对特殊操作符 setq 的调用, setq 可访问到词法和动态绑定。
因为所有的变量都是引用,所以为一个绑定赋新值对该变量的其他绑定没有效果,且对赋值之前绑定上保存的值也没有影响。、
setf 返回最近被赋的值。
所有的复制都可以用 setf
修改宏
(setf x (+ x 1)) //等同于
(incf x 1)
(setf x (- x 10) //等同于
(decf x 10)
像 incf , decf 这种宏称为修改宏 (modify macro)
修改宏是建立在 setf 之上的宏
好像上面的例子中好像修改宏并没有多大用处,请看下面例子
//修改宏
(incf (aref *array* (random (length *array*))))
// setf
(setf (aref *array* (random (length *array*)))
(aref *array* (random (length *array*))))
// aref 访问数组
// (aref array index)
很明显下面的 setf 宏写的并不能像上面的修改宏一样达到数组随机一个位置修改,如果想达到这个目的,只能很麻烦的这么写
(let ((tmp (random (length *array*))))
(setf (aref *array* tmp) (+1 (aref *array* tmp))))
rotatef shiftf 修改宏 :
// 轮换 a b 返回 nil
(rotatef a b)
// 等同于
(let ((tmp a)) (setf a b b tmp) nil)
shiftf 后面的值向左移动赋值
rotatef 和 shiftf 都可跟多个参数,和所有修改宏一样,可以保证从左到右顺序,每个参数只求值一次。
progn
按顺序执行任意数量的形式并返回最后一个形式的值,类似大括号,C 语言的逗号。