在Common Lisp

时间:2015-11-19 05:26:42

标签: common-lisp dispatch clos mop

我试图用Common Lisp的CLOS模拟类似于Haskell的类型类的东西。也就是说,我希望能够在对象"类别"上发布方法。而不是它的超类。

我有一个为具有和实现类型类(它们只是其他类)的类定义的元类。这些类(实现类型类的那些)有一个包含它们实现的类型类列表的槽 我希望能够为类型类定义方法,然后能够在类实现该类型类的对象上调度该方法。我希望能够动态添加和删除类型类。

我想我可以通过改变方法调度算法来做到这一点,尽管这看起来并不太简单。

任何人都对CLOS和MOP足够自在,给我一些建议吗?

感谢。

修改:我的问题可能被指定为,如何为"自定义"实施compute-applicable-methods-using-classescompute-applicable-methods泛型函数类,如果泛型函数方法的某些特化器是类型类(其元类是'类型类'类),那么相应的参数类必须实现类型类(只是意味着将类型类存储在参数类的槽中以使该方法适用? 根据我从文档中理解的情况,当调用泛型函数时,首先调用compute-discriminating-function,它将首先尝试通过compute-applicable-methods-using-classes获取适用的方法,如果不成功,将尝试使用{{1} }}。
虽然我对compute-applicable-methods的定义似乎有效,但泛型函数无法分派适用的函数。所以问题必须在compute-applicable-methods-using-classescompute-discriminating-function

请参阅code

1 个答案:

答案 0 :(得分:1)

我相信您需要覆盖compute-applicable-methods和/或compute-applicable-methods-using-classes,它们会计算实现通用函数调用所需的方法列表。然后,您可能需要覆盖compute-effective-method,它将该列表和其他一些内容组合到一个函数中,该函数可以在运行时调用以执行方法调用。

我真的建议阅读The Art of the Metaobject Protocol(如前所述),详细介绍了这一点。但是,总结一下,假设您在某些类上定义了一个方法foo(这些类不需要以任何方式相关)。评估lisp代码(foo obj)会调用compute-effective-method返回的函数,该函数检查参数以确定调用哪些方法,然后调用它们。 compute-effective-method的目的是通过将类型测试编译成case语句或其他条件来尽可能地消除此运行时的成本。因此,每次进行方法调用时,Lisp运行时不必查询所有方法的列表,而只需在添加,删除或更改方法实现时查询。通常所有这些都是在加载时完成的,然后保存到lisp映像中以获得更好的性能,同时仍允许您在不停止系统的情况下更改这些内容。