setf中的f代表什么?

32

LISP有setf函数来给变量分配值。现在我一直在想这个函数名的含义:其中set很明显,但是f后缀代表什么?

LISP 中的 `setf` 函数用于给变量赋值。目前我一直在思考这个函数名称的由来:`set` 显然代表设置,但 `f` 后缀是指什么?

8
这是一个有趣的问题。这并不一定是一个编程问题(因为它不是关于如何使用 setf),但它并没有一个明显的答案,了解命名约定和历史通常可以帮助程序员更好地理解语言模型。顺便说一句,在setq中的“q”更容易理解。在旧版本的 Lisp 中,使用符号的 symbol-value 更加普遍,所以将 (set 'foo ...) 缩写为 (setq foo ...) 是很好的(因此,“q”代表 quote)。 - Joshua Taylor
1
谢谢您的好评 :-))。对于像我这样的LISP初学者来说,有些名称很难理解,例如evenpoddp:我只是想知道p代表什么,如果您真正理解它们的名称(因此也理解它们的含义),那么这肯定有助于记忆函数。 - Golo Roden
5
P代表“谓词”。 - Joshua Taylor
2
你可能会对http://www.cliki.net/Naming+conventions感兴趣,但请注意它有“generalized field for f in setf”。 - Joshua Taylor
再次感谢您指出这个问题 :-) - Golo Roden
1个回答

41

F的实际含义经常被人们遗忘。根据一些来源,后缀f可以代表:

但是,根据Gabriel和Steele的Lisp演化,SETF来自Peter Deutsch的非常紧凑的Lisp机器(1973年出版),其中F代表function

在这篇论文中,Peter Deutsch写道:

SET函数被扩展,以便如果第一个参数是列表(fn argl ... argn)而不是变量,则将在“存储”模式下调用函数fn,参数为argl ... argn和newvalue (SET的第二个参数)。 SETQ也以类似的方式进行了扩展,但并不特别有用。更有用的函数是(SETFQ (fn argl ... argn) newvalue),它引用 函数名并评估其他所有内容。例如,这允许将RPLACA定义为(LAMBDA (X Y) (SETFQ (CAR X) Y))

(强调是我的)

Gabriel和Steele解释了这是如何变成SETF的:

这个名字在Lisp-Machine Lisp中被缩写为SETF。


谢谢您指出这一点,现在我知道要注意哪些术语了 :-)! - Golo Roden
@GoloRoden,有两个相互矛盾的答案,你怎么知道这个是正确的? - henginy
我不能确定它是否正确,但我谷歌了这两个术语并找到了另一个(相当受欢迎的)答案建议使用“field”而不是“form”。除此之外,这个答案更有帮助,因为它还指出了“q”代表什么。 - Golo Roden
感谢分享链接。现在其他查看此问题的人也可以知道如何操作了。 - henginy
4
我使用可靠的来源修正了答案。F代表函数,而不是形式或字段。 - Paul Guyot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接