阅读这个问题让我思考了什么是有效的汽车表达。显然,可以使用通常的语法“调用”符号和 lambda。根据hyperspec,
函数名n. 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))
GNU CLISP、SBCL 和 ABCL 都会让我定义这个函数。但是,SBCL 和 ABCL 不允许我使用片段中显示的任何语法来调用它。另一方面,CLISP 将运行前两个,但在第三个仍然会出错。
我很好奇哪个编译器的行为正确。由于 SBCL 和 ABCL 同意,我会冒险猜测正确的实现应该拒绝该代码。作为第二个问题,我如何从代码片段中调用我令人难以置信的设计无用的函数,因为我上面尝试的东西不能移植。或者,也许更有用的是,