4

我发现阅读可以在sicp中进行功能性动态调度的一种方法很有趣- 使用类型为标签 + 名称的表 -> 可以从中获取或添加的函数。

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

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

4

1 回答 1

2

根据这篇关于 JHC Haskell 编译器及其如何实现类型类的文章,我相信这是一种典型的类型分派机制,即使对于非动态非 OO 语言也是如此。文章中的暗示是大多数 Haskell 编译器通过传递字典来实现类型类(一种类型分派)。他的替代方案是直接案例分析,这可能不适用于动态类型语言,因为您不提前知道表达式成分的类型是什么。另一方面,这在运行时也不能扩展。

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

如果您使用的是纯功能持久映射或字典,您当然可以实现此功能,甚至不需要继承映射链;当您“修改”地图时,您会得到一张新地图,但对旧地图的所有现有引用仍然有效,并将其视为旧版本。如果您正在使用此工具实现一种语言,您可以通过将 type->function 映射放在 Reader monad 中并将解释器包装在其中来解释它。

于 2011-07-14T18:22:34.273 回答