7

出色的 2011 年 Raku Advent of Raku 后元编程:什么、为什么以及如何提供了一些清晰的示例,说明如何使用EXPORTHOW来创建像class. 这是第一个:

my class SingleInheritanceClassHOW
    is Metamodel::ClassHOW
{
    method add_parent(Mu $obj, Mu $parent) {
        if +self.parents($obj, :local) > 0 {
            die "Multiple inheritance is forbidden!";
        }
        callsame;
    }
}
my module EXPORTHOW { }
EXPORTHOW.WHO.<class> = SingleInheritanceClassHOW;

有没有办法为声明者做类似的事情sub(也就是说,允许用户提供签名和块,而不是允许用户提供属性和方法)?a 的元类SubClassHOW,所以看起来类似的东西应该是可能的,但我没有看到这样做的方法。

4

1 回答 1

8

EXPORTHOW机制仅用于覆盖将用于包声明符的元类,并进行轻微扩展,该扩展EXPORTHOW::DECLARE还执行语法调整以引入新的包声明符。

虽然可以调用.HOWa Sub,但结果与子例程本身无关,而是与类型的元类有关Sub,其中子例程是一个实例。

真的,EXPORTHOW是一种“简单易行”的机制(在某种程度上可以公平地称任何与元编程相关的事情都很容易!)它也是一件简单的事情:包声明的解析已经非常规则,编译器已经维护了一个从包关键字到元类的映射表,因此为模块提供一种方法来替换该表中的条目(或添加新条目DECLARE)只是编译器黑客的几个小时。

例程的规律性大大降低,即使这在语法上只是有点明显。虽然包几乎可以解析关键字(class, role, , 等),并且所有它们的语法和语义都完全相同(模角色允许签名),但每个, ,和grammar后面都有单独的解析规则和语义. 它们与整个编译过程的交互也相当多。正在进行的 RakuAST 努力为这种混乱带来了更多的秩序,并且最终 - 当与俚语结合时 - 将提供一种引入新的类似结构的方法,并赋予它们语义。submethodmacrorulesub

于 2021-12-13T23:18:20.000 回答