Peter Norvig 在第50页的"人工智能编程范式"中提到了特异性和一致性之间的权衡以及选择使用setq或setf将变量更新为值时的权衡.您有什么推荐的吗?您是否遇到过重要性超出可读性的情况?
使用setq更低级别,但setf的性能不是问题.并且setf允许您(或库编写者)提供自定义setf行为,例如设置自定义数据结构的部分.我说:除非你有理由不去,否则到处都去.
另见Practical Common Lisp,第3章:"SETF宏是Common Lisp的主要赋值运算符." PCL可在线免费获取:http://gigamonkeys.com/book/
FWIW,我总是使用setf
.如果我稍微更改了代码的结构,我只需要更改"地点"而不是地点和运算符(setq - > setf).
另外,不要担心性能,setf与符号的setq完全相同:
CL-USER> (macroexpand '(setf foo 42)) (SETQ FOO 42)
您可以setf
在任何可以使用的地方使用setq
.实际上, setf
实际上是一个建立在其上的宏setq
.所以,这应该纯粹是一个可读性和风格问题.
我见过的几乎所有代码都避免使用setq
和使用setf
.