主要观点:作者意识到对setf
的理解有误,setf
是宏,能访问参数结构但不能访问其值,其使用方式与常见认知不同,且可通过定义新的setf
形式进行多种操作,还可构建类似setf
的宏。
关键信息:
setf
在 Lisp 中可定义新的赋值形式,如在 CLOS 中,类定义会产生读取和设置槽值的函数。setf
是宏,不能按预想的对变量位置进行操作,而是在编译时根据第一个参数(定位器)的结构调度到相应方法。- 选择器是任意的,可定义新的
setf
特殊化形式,如(setf head)
。 setf
的 lambda 列表可以有更多参数,如对数组的setf
形式。- 可以根据新值的类型进行特殊化。
- 可以构建自己的
setf
类似宏,通过合成函数名和调用泛型函数来实现。
重要细节: - 以
(setf (a-var instance) 24)
为例,setf
会展开为针对特定类和选择器的方法。 - 如
(setf (head l) 45)
可定义新的head
特殊化形式来设置列表头部。 - 对数组的
setf
形式(setf (aref a 23) 0)
实际是分解类似函数调用的模式。 - 构建
our-setf
宏时,需合成函数名并调用泛型函数,且要定义相关泛型函数。 - 要注意合成的函数名不能意外捕获用户代码的名称,
setf
合成的名字是列表形式不易被意外捕获。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。