使用 EXPORTHOW 使声明符的行为类似于 "sub"
Using EXPORTHOW to make declarator that acts like "sub"
出色的 2011 Advent of Raku post Meta-programming: what, why and how 提供了一些使用 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
一样的声明器做类似的事情(也就是说,允许用户提供签名和阻止,而不是允许用户提供属性和方法) ? Sub
的元类是 ClassHOW
,因此 似乎 类似的东西应该是可能的,但我没有看到这样做的方法。
EXPORTHOW
机制仅用于覆盖将用于包声明符的元类,稍微扩展 EXPORTHOW::DECLARE
还执行引入新包声明符的语法调整。
虽然可以在 Sub
上调用 .HOW
,但结果与子例程本身无关,而是 Sub
类型的元类,其中一个子例程是一个实例。
真的,EXPORTHOW
是一种“简单的事情很容易”的机制(在一定程度上可以将与元编程相关的任何事情称为简单!)它也是一个简单的东西:包的解析声明已经非常规则,并且编译器已经维护了从 package 关键字到元类的映射 table,因此为模块提供了一种方法来替换 table 中的条目(或为 [=16 添加新条目) =]) 只是几个小时的编译器黑客。
例程远没有那么规律,即使这在句法上只是有些明显。虽然包几乎解析了关键字(class
、role
、grammar
等),但接下来的语法和语义完全相同(允许签名的模数角色) ,sub
、method
、macro
和 rule
背后都有单独的解析规则和语义。它们与整个编译过程的交互也更加复杂。正在进行的 RakuAST 工作正在为这种混乱带来更多秩序,并且最终 - 当与俚语相结合时 - 将提供一种引入新的 sub
类结构的方法,并赋予它们语义。
出色的 2011 Advent of Raku post Meta-programming: what, why and how 提供了一些使用 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
一样的声明器做类似的事情(也就是说,允许用户提供签名和阻止,而不是允许用户提供属性和方法) ? Sub
的元类是 ClassHOW
,因此 似乎 类似的东西应该是可能的,但我没有看到这样做的方法。
EXPORTHOW
机制仅用于覆盖将用于包声明符的元类,稍微扩展 EXPORTHOW::DECLARE
还执行引入新包声明符的语法调整。
虽然可以在 Sub
上调用 .HOW
,但结果与子例程本身无关,而是 Sub
类型的元类,其中一个子例程是一个实例。
真的,EXPORTHOW
是一种“简单的事情很容易”的机制(在一定程度上可以将与元编程相关的任何事情称为简单!)它也是一个简单的东西:包的解析声明已经非常规则,并且编译器已经维护了从 package 关键字到元类的映射 table,因此为模块提供了一种方法来替换 table 中的条目(或为 [=16 添加新条目) =]) 只是几个小时的编译器黑客。
例程远没有那么规律,即使这在句法上只是有些明显。虽然包几乎解析了关键字(class
、role
、grammar
等),但接下来的语法和语义完全相同(允许签名的模数角色) ,sub
、method
、macro
和 rule
背后都有单独的解析规则和语义。它们与整个编译过程的交互也更加复杂。正在进行的 RakuAST 工作正在为这种混乱带来更多秩序,并且最终 - 当与俚语相结合时 - 将提供一种引入新的 sub
类结构的方法,并赋予它们语义。