Чтение этот вопрос заставил меня задуматься о том, что является действительной машиной выражения. Очевидно, что символы и лямбды можно «вызывать», используя обычный синтаксис. Согласно гиперспеку ,
имя функции 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 согласны, я рискну предположить, что правильная реализация должна отклонить этот код. В качестве второго вопроса, как бы я назвал мою невероятно изощренную бесполезную функцию из фрагмента кода, поскольку то, что я пробовал выше, не работает переносимо. Или, может быть, более полезно,