Common Lisp笔记(4)

来源:互联网 发布:basinmod软件下载 编辑:程序博客网 时间:2024/05/21 03:17

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 语言的逗号。

1 0