2016-12-05 2 views
0

В defun макро «хранит» функция объект в функции слот символа, например:

(defun f() "Hello.")
Функция, которая печатает «Привет» теперь сохраняется в функциональном слоте символа f.
(И может быть получен через #'f.)

Есть ли другой способ (кроме defun) написать/«сохранить» функциональный объект в слоте функции символа?

Потому что что-то вроде (setf minus #'-) только сохранит функциональный объект в значение слот символа minus.запись доступ ко слот функции (кроме DEFUN)

ответ

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).

+1

также 'fdefinition' – sds

+0

@Renzo @sds Спасибо! Я всегда думал, что «символьная функция» есть только какая-то геттер. Но в соответствии с вашим примером он также может использоваться как место в сеттере. Переходим к проверке HyperSpec относительно 'symbol-value'. Еще раз спасибо. – Frank

+1

Обратите внимание, что это работает только для привязок верхнего уровня (глобального). Он будет игнорировать лексические привязки, созданные в пространстве имен функций с 'flet' и' label' – Sylwester