В defun
макро «хранит» функция объект в функции слот символа, например:
(defun f() "Hello.")
Функция, которая печатает «Привет» теперь сохраняется в функциональном слоте символа f
.
(И может быть получен через #'f
.)
Есть ли другой способ (кроме defun
) написать/«сохранить» функциональный объект в слоте функции символа?
Потому что что-то вроде (setf minus #'-)
только сохранит функциональный объект в значение слот символа minus
.запись доступ ко слот функции (кроме DEFUN)
0
A
ответ
4
Есть ли другой способ (кроме defun) написать/«сохранить» объект функции в функциональном слоте символа?
Вы можете использовать symbol-function
:
(setf (symbol-function 'f) (lambda() "Bye."))
(f) ; => "Bye."
(defun g() "Hello again.")
(setf (symbol-function 'f) (symbol-function 'g))
(f) ; => "Hello again."
Другая возможность заключается в использовании fdefinition
:
(setf (fdefinition 'f) (lambda() "Bye again.")
(f) ; => "By again"
Они почти эквивалентны. Основное различие заключается в том, что symbol-function
требует аргумента, который должен быть быть символом, а fdefinition
принимает имя функции, которое может быть также списком (см. glossary).
также 'fdefinition' – sds
@Renzo @sds Спасибо! Я всегда думал, что «символьная функция» есть только какая-то геттер. Но в соответствии с вашим примером он также может использоваться как место в сеттере. Переходим к проверке HyperSpec относительно 'symbol-value'. Еще раз спасибо. – Frank
Обратите внимание, что это работает только для привязок верхнего уровня (глобального). Он будет игнорировать лексические привязки, созданные в пространстве имен функций с 'flet' и' label' – Sylwester