方法泛型函数的含义是什么?

问题描述

我正在学习common-lisp和CLOS。

我从http://cl-cookbook.sourceforge.net/clos-tutorial/开始学习本教程

在第4.3节中,它提到了

泛型函数一个lisp函数,它与一组方法相关联,并在调用时调度它们。

它还提供了两个功能generic-function-methodsmethod-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>

我能理解第一个(即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 *),它似乎返回了最后一个表达式的值。

解决方法

  • Method-generic-function为您提供了与给定方法关联的通用功能。
  • Method-generic-function未导入SBCL的cl-user程序包中。您将在sb-mop中找到它(因此,sb-mop:method-generic-function)。 MOP并未完全纳入Common Lisp标准。
  • 要便携式使用整个MOP,请使用库“ Closer to MOP”(closer-mop)。
  • 在REPL中,*表示最后一个求值表达式的第一个返回值。您的情况就是generic-function-methods返回的方法列表。因此,您会发现在一对多关系中,这两个或多或少是反函数。