我对 setf 的心理模型是错误的

主要观点:作者意识到对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合成的名字是列表形式不易被意外捕获。
阅读 11
0 条评论