【发布时间】:2015-11-19 05:26:42
【问题描述】:
我正在尝试使用 Common Lisp 的 CLOS 模拟类似于 Haskell 的类型类的东西。也就是说,我希望能够在对象的“类型类”而不是其超类上调度方法。
我为具有并实现类型类(只是其他类)的类定义了一个元类。这些类(那些实现类型类的)有一个槽,其中包含它们实现的类型类列表。
我希望能够为类型类定义方法,然后能够在其类实现该类型类的对象上分派该方法。而且我希望能够动态添加和删除类型类。
我想我可以通过更改方法分派算法来做到这一点,尽管这似乎不太简单。
有人对 CLOS 和 MOP 感到满意,可以给我一些建议吗?
谢谢。
编辑:我的问题可能被指定为,我如何为“自定义”泛型函数类实现compute-applicable-methods-using-classes 和compute-applicable-methods,这样,如果泛型函数方法的某些专家是类型类(元类的类是'typeclass'类),那么相应参数的类必须实现类型类(这只是意味着将类型类存储在参数类的插槽中)才能应用该方法?
据我从文档中了解到,当调用泛型函数时,首先调用compute-discriminating-function,它将首先尝试通过compute-applicable-methods-using-classes获取适用的方法,如果不成功,将尝试与compute-applicable-methods相同。
虽然我对compute-applicable-methods-using-classes 的定义似乎有效,但通用函数无法调度适用的函数。所以问题一定出在compute-discriminating-function或compute-effective-method。
见code。
【问题讨论】:
-
我对这些主题不太满意,但我认为您应该阅读元对象协议的艺术。 mitpress.mit.edu/books/art-metaobject-protocol
-
你应该看看 Faré 的 Lisp 接口库:common-lisp.net/~frideau/lil-ilc2012/lil-ilc2012.html。据我了解,这就是类型类在动态类型语言中的样子。
-
你能解释一下普通的泛型函数不在这里为你做什么吗?我知道 CLOS 类与 Haskell 的类型类不同,但由于泛型函数不“属于” CLOS 中的类,因此类型类似乎只是泛型函数的集合,并使类成为该类型类仅意味着在这些通用函数上定义适当的方法。这种方法有什么问题?只是您想要确保定义了所有适当的方法吗?
-
例如,什么不会与gist.github.com/tayloj/1f5cea36ea32201d2e3c这样的东西一起使用?
标签: common-lisp dispatch clos mop