Peter Norvig在Paradigms of Artificial Intelligence Programming中提到page 50,在特异性和一致性之间进行权衡,并选择使用setq或setf将变量更新为值。您有什么推荐的吗?你是否曾经遇到过一种超出可读性的问题?
答案 0 :(得分:17)
使用setq更低级别,但setf的性能不是问题。并且setf允许您(或库编写者)提供自定义setf行为,例如设置自定义数据结构的部分。我说:除非你有理由不去,否则到处都是setf。
另见Practical Common Lisp,第3章:“SETF宏是Common Lisp的主要赋值运算符。” PCL可在线免费获取:http://gigamonkeys.com/book/
答案 1 :(得分:11)
FWIW,我总是使用setf
。如果我稍微更改了代码的结构,我只需要更改“地点”而不是地点和运算符(setq - > setf)。
另外,不要担心性能,setf与符号的setq完全相同:
CL-USER> (macroexpand '(setf foo 42))
(SETQ FOO 42)
答案 2 :(得分:10)
您可以在setf
的任何地方使用setq
。事实上,setf
实际上是一个基于setq
的宏。所以,这应该是纯粹的可读性和风格问题。
我见过的几乎所有代码都避免使用setq
并使用setf
。
答案 3 :(得分:3)
setf是“设置字段”,它会更改位置并且可以拥有用户扩展名。 setq设置为引用第一个参数。
答案 4 :(得分:1)
我建议你遵循Norvig在该部分的最终建议:保持一致。 “可读性”当然是在编程中做出任何选择的最重要原因。如果与读者沟通(可能是在2个月后),您正在处理符号的整个值单元格,那么请使用setq
;否则使用setf
。但只有你保持一致。
答案 5 :(得分:-2)
如果你在任何地方使用setf而不是setq,那就不会错。
正是这样的事情让Common Lisp不再向前发展,许多未使用的东西仍然需要支持。