В чем смысл универсальной функции метода?

Я изучаю общий язык и CLOS.

Я начал с учебника с http://cl-cookbook.sourceforge.net/clos-tutorial/

В разделе 4.3 упоминалось, что

Обобщенная функция — это лисп-функция, которая связана с набором методов и отправляет их при вызове.

Также представлены две функции generic-function-methods и method-generic-function:

CL-USER 63 > #'my-describe
#<STANDARD-GENERIC-FUNCTION MY-DESCRIBE 21111C2A>

CL-USER 64 > (generic-function-methods #'my-describe)
(#<STANDARD-METHOD MY-DESCRIBE NIL (T) 2110B544>
 #<STANDARD-METHOD MY-DESCRIBE NIL (ANIMAL) 21111BF4>)

CL-USER 65 > (method-generic-function (car *))
#<STANDARD-GENERIC-FUNCTION MY-DESCRIBE 21111C2A>

Я могу понять 1-й (то есть generic-function-methods), он сообщает мне набор методов в универсальной функции my-describe.

А как насчет второго (то есть (method-generic-function (car *)))?

Я не совсем понимаю.

PS: я пытался использовать эту функцию в REPL, но не удалось:

CL-USER> #'method-generic-function

undefined.
   [Condition of type UNDEFINED-FUNCTION]

Моя среда — это SBCL + quicklisp + слизь.

Могу ли я использовать эту функцию в SBCL?

Спасибо.


Обновлять:

Кажется, я понимаю значение method-generic-function:

Он просто возвращает универсальную функцию из конкретного метода #<STANDARD-METHOD MY-DESCRIBE NIL (T) 2110B544>.

Сбивает с толку то, что * в (car *), кажется, возвращает значение последнего выражения.


person chansey    schedule 14.08.2020    source источник


Ответы (1)


  • Method-generic-function дает вам общую функцию, с которой связан данный метод.
  • Method-generic-function не импортируется в пакет cl-user в SBCL. Вы найдете его в sb-mop (так, sb-mop:method-generic-function). MOP не полностью включен в стандарт Common Lisp.
  • Для портативного использования всей СС используйте библиотеку «Ближе к СС» (closer-mop).
  • В REPL * относится к первому возвращаемому значению последнего вычисленного выражения. В вашем случае это был список методов, возвращаемых generic-function-methods. Итак, вы видите, что эти две функции являются более или менее обратными функциями в этом отношении «один ко многим».
person Svante    schedule 14.08.2020