Lisp风格:setq与setf

时间:2009-06-09 18:29:34

标签: lisp common-lisp

Peter Norvig在Paradigms of Artificial Intelligence Programming中提到page 50,在特异性和一致性之间进行权衡,并选择使用setq或setf将变量更新为值。您有什么推荐的吗?你是否曾经遇到过一种超出可读性的问题?

6 个答案:

答案 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不再向前发展,许多未使用的东西仍然需要支持。