如何修补泛型类型标记函数表

时间:2011-06-21 07:09:25

标签: monkeypatching dispatch dynamic-dispatch

我发现在sicp中使用标签+名称 - >类型的表格可以进行功能动态调度的方法之一。您可以从中获取或添加的函数。

我想知道,这是一种动态非OO语言的典型类型调度机制吗?

使用表的链接列表(如果你没有在第一个表中找到它,以递归的方式尝试下一个表),那么通过猴子路径这是什么样的典型方法?将本地范围内的表重新绑定到修改后的副本? ECT?

1 个答案:

答案 0 :(得分:2)

我认为这是一种典型的类型调度机制,即使对于非动态非OO语言,基于this article about the JHC Haskell compiler以及它如何实现类型类。本文的含义是大多数Haskell编译器通过传递字典来实现类型类(一种类型调度)。他的替代方案是直接案例分析,这可能不适用于动态类型语言,因为您事先并不知道表达式的组成部分将是什么类型。另一方面,这在运行时也是不可扩展的。

对于动态非OO语言,我不了解Lisp / Scheme之外的许多示例。 Common Lisp的CLOS使Lisp成为一种正确的OO语言,并提供动态调度和多次调度(您可以在运行时添加或删除泛型和方法,并且它们可以键入不仅仅是第一个参数的类型)。我不知道这通常是如何实现的,但我知道它通常是一个附加工具而不是内置工具,这意味着它使用了可能的猴子修补程序可用的功能,而且某些版本因速度不足而受到批评(CLISP,我认为,但他们可能已经解决了这个问题)。当然,你也可以在OO语言中实现这种类型的并行调度机制,你可以找到很多这样的例子。

如果你使用纯功能的持久性地图或字典,你甚至可以在不需要继承地图链的情况下实现这种能力;当您“修改”地图时,您会返回一个新地图,但旧地图的所有现有引用仍然有效,并将其视为旧版本。如果您使用此工具实现语言,则可以通过将类型>函数映射放在Reader monad中并将解释器包装在其中来解释它。