Setf函数名称

Sil*_*olo 1 lisp common-lisp setf

这个问题让我思考什么构成了一个有效的表达式汽车.显然,可以使用通常的语法"调用"符号和lambdas.按照hyperspec,

函数名 ñ.1.(在环境中)符号或列表(setf符号),它是该环境中函数的名称.2.符号或列表(setf符号).

因此,理论上讲,它(setf some-name)是一个函数名称.我决定尝试一下.

(defun (setf try-this) ()
  (format t "Don't name your functions like this, kids :)"))

((setf try-this))
(funcall '(setf try-this))
(setf (try-this))
Run Code Online (Sandbox Code Playgroud)

GNU CLISP,SBCL和ABCL都将让我定义这个功能.但是,SBCL和ABCL不允许我使用代码段中显示的任何语法来调用它.另一方面,CLISP将运行前两个但仍然在第三个错误.

我很好奇哪个编译器的行为正确.由于SBCL和ABCL同意,我猜测正确的实现应该拒绝该代码.作为第二个问题,我如何从代码片段中调用我令人难以置信的无用功能,因为我上面尝试过的东西不能轻松工作.或者,也许更有用,

Bar*_*mar 6

SETF函数必须采取至少一个参数,该参数将被存储在该地方的新值.它也可以采用其他参数,这些参数将从调用中的place表达式中的参数填充SETF.

使用时SETF,它必须具有偶数个参数:您指定的每个位置都需要分配值.

所以它应该是:

(defun (setf try-this) (new-value) 
    (format t "You tried to store ~S~%" new-value))
(setf (try-this) 3)
(funcall #'(setf try-this) 'foo)
Run Code Online (Sandbox Code Playgroud)

你不能使用

((setf try-this) 'bar)
Run Code Online (Sandbox Code Playgroud)

因为car表单不包含函数名称.它只能是符号或lambda表达式(尽管实现可能允许其他格式作为扩展).