Can';t变量是否可以在通用函数方法中使用?(CLOS/LISP)

Can';t变量是否可以在通用函数方法中使用?(CLOS/LISP),lisp,common-lisp,clos,generic-function,Lisp,Common Lisp,Clos,Generic Function,我正在学习CLOS中的泛型函数 由于我在教科书和网上找到的例子类型,我感到非常困惑。示例总是使用这样一个事实,即存在多个分派。根据参数类型,将执行不同的计算。然而,为什么在示例中从未使用参数本身 示例代码来自 在上面的示例中,您可以看到方法本身实际上从未使用x或y变量。所有这些例子都没有使用变量,这是巧合吗?它们能被使用吗 此外,它写在: 方法是与类分开定义的,它们对类槽没有特殊的访问权限(例如“this”、“self”或“protected”) 好的,所以方法没有“this”,因为它们不属于类

我正在学习CLOS中的泛型函数

由于我在教科书和网上找到的例子类型,我感到非常困惑。示例总是使用这样一个事实,即存在多个分派。根据参数类型,将执行不同的计算。然而,为什么在示例中从未使用参数本身

示例代码来自

在上面的示例中,您可以看到方法本身实际上从未使用
x
y
变量。所有这些例子都没有使用变量,这是巧合吗?它们能被使用吗

此外,它写在:

方法是与类分开定义的,它们对类槽没有特殊的访问权限(例如“this”、“self”或“protected”)


好的,所以方法没有“this”,因为它们不属于类。但是为什么通用函数方法可以有一个接收器呢?接收者与类中的“this”不是很相似吗?

这些示例只是展示了基于类型的分派是如何工作的,因此他们不必费心使用变量。但是你当然可以,例如

(defmethod f ((x integer) (y symbol))
    (* x x))

(f 3 'foo) => 9

使用接收器只是一种惯例。如果您想像其他OOP语言一样使用CLOS,您可以只调度第一个参数的类型。您可以将其称为
this
self
,以明确目的。

确保可以从参数列表访问变量。wikipedia示例仅用于说明哪个方法返回值

但是为什么通用函数方法可以有一个接收器呢?接受者与类中的“this”不是很相似吗

CLOS通用函数没有单个接收器,因此使用receiver一词没有任何意义。您提到的实现可能没有实现完整的CLO,而是一个没有多次分派的变体

CLOS示例:

CL-USER 8 > (defmethod plus ((s1 string) (s2 string))
              (concatenate 'string s1 s2))
#<STANDARD-METHOD PLUS NIL (STRING STRING) 4020001E6B>

CL-USER 9 > (plus "foo" "bar")
"foobar"
这更有用:

(defmethod plus ((string-1 string) (string-2 string))
   (concatenate 'string string-1 string-2))

这一切都清楚了!接受者只是一个论点。。当然谢谢
(defmethod plus ((receiver string) (argument string))
   (concatenate 'string receiver argument))
(defmethod plus ((string-1 string) (string-2 string))
   (concatenate 'string string-1 string-2))