Common Lisp笔记(4)

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值