gpt4 book ai didi

oop - Common Lisp 对象系统中的通用调度与经典 OOP 中的动态调度相同吗?

转载 作者:行者123 更新时间:2023-12-03 23:25:44 24 4
gpt4 key购买 nike

我正在阅读 Sonja Keene 的 Common Lisp 中的面向对象编程一书。
在第 2 章中,作者说:

The procedure for determining which methods to call and then calling them is called generic dispatch. It happens automatically whenever a generic function is called.


这让我想起了动态调度定义(根据 Wikipedia):

Dynamic dispatch is the process of selecting which implementation of a polymorphic operation to call at run time. It is commonly employed in, and considered a prime characteristic of, object-oriented programming languages and systems.


不幸的是,维基百科确实 不是 有一个关于 的条目通用 dispatch 。
因此,我想问:
1 - 动态调度和通用调度基本上是一回事吗?有什么相似之处?
2 - 有什么区别?由于 CLOS 的灵 active ,动态调度是通用调度的某种子集吗?

最佳答案

一般来说,泛型调度只是意味着根据泛型函数的一个或多个参数选择一个泛型函数的实现。
这适用于单调度(如 Lisp 的 Flavors 系统)或多调度(如 Lisp 的 CLOS)。
在 CLOS 和 Flavors 中,通用函数捆绑了各种方法。这些方法可能是不同的方法类型(主要、之前、之后、...)和/或专门用于一种或多种参数类型。
Flavors 和 CLOS 的通用调度选择适用的方法并计算一个有效的方法,然后使用提供的参数调用这个方法。
例子:

CL-USER 7 > (defmethod greet :before ((w world)) (princ "hello"))  
#<STANDARD-METHOD GREET (:BEFORE) (WORLD) 40200211B3>

CL-USER 8 > (defmethod greet ((w world)) (princ "world") (values))
#<STANDARD-METHOD GREET NIL (WORLD) 40200221F3>

CL-USER 9 > (defmethod greet :after ((w world)) (princ "."))
#<STANDARD-METHOD GREET (:AFTER) (WORLD) 402002317B>

CL-USER 10 > (greet (make-instance 'world))
helloworld.
如您所见,通用调度机制以指定的顺序自动调用多个不同的适用方法。
CLOS 的泛型调度还可以根据所有需要的参数及其类型选择方法 -> 多调度。
总结 : CLOS(和 Flavors,...)中的通用调度意味着选择适用的方法 将它们组合成一个有效的方法。这是动态调度的一种特定形式。动态调度 OTOH 通常只调用一种方法,并且通常仅基于一个参数进行选择。然后,CLOS 支持以多种分派(dispatch)和方法组合的形式进行通用分派(dispatch)。

关于oop - Common Lisp 对象系统中的通用调度与经典 OOP 中的动态调度相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67896358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com