LISP有setf
函数来给变量分配值。现在我一直在想这个函数名的含义:其中set
很明显,但是f
后缀代表什么?
LISP有setf
函数来给变量分配值。现在我一直在想这个函数名的含义:其中set
很明显,但是f
后缀代表什么?
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。
setq
中的“q”更容易理解。在旧版本的 Lisp 中,使用符号的symbol-value
更加普遍,所以将(set 'foo ...)
缩写为(setq foo ...)
是很好的(因此,“q”代表quote
)。 - Joshua Taylorevenp
和oddp
:我只是想知道p
代表什么,如果您真正理解它们的名称(因此也理解它们的含义),那么这肯定有助于记忆函数。 - Golo Roden