彼得·诺维格在《人工智能编程范式》(Paradigms of Artificial Intelligence Programming)中提到,在选择使用setq或setf将变量更新为一个值时,特定性和一致性之间存在权衡。你有什么建议?你是否遇到过除了可读性以外的重要情况?page 50
彼得·诺维格在《人工智能编程范式》(Paradigms of Artificial Intelligence Programming)中提到,在选择使用setq或setf将变量更新为一个值时,特定性和一致性之间存在权衡。你有什么建议?你是否遇到过除了可读性以外的重要情况?page 50
顺便说一下,我总是使用setf
。如果我稍微更改了代码的结构,我只需要更改“位置”而不是位置和操作符(setq-> setf)。
另外,不用担心性能问题,对于符号而言,setf与setq完全相同:
CL-USER> (macroexpand '(setf foo 42))
(SETQ FOO 42)
您可以在任何使用setq
的地方使用setf
。实际上,setf
是一个基于setq
构建的宏。因此,这应该纯粹是可读性和样式问题。
我看到的几乎所有代码都避免使用setq
,而使用setf
。
setf 是 "set field" 的缩写,它可以更改一个 位置 并且可以具有用户扩展功能。setq 使用引用第一个参数进行设置。
setq
;否则请使用setf
。 但只有在保持一致的情况下才这样做。如果你在所有地方都使用setf而不是setq,那么你不会错。
正是这样的事情阻碍了Common Lisp的前进,有很多未使用的东西需要实现者仍然需要支持。