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

我发现阅读
sicp中可以进行功能动态调度的一种方法很有意思 – 使用标签名称类型的表 – >您可以从中获取或添加的功能.

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

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

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

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

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

点赞