class Metamodel::Primitives {}

Metamodel::Primitives 提供低级操作,用于处理类型,而这些类型通常只能作为与实现相关的指令使用。这些基元可用作类方法。

以下是一个示例,它从 Int 类中窃取元模型实例,以创建一个自定义类型(通常,如果你处理低级内容,你会创建自己的元类),它允许仅调用一个名为 why 的方法

my Mu $type := Metamodel::Primitives.create_type(Int.HOW'P6opaque');
$type.^set_name('why oh why?');
my %methods =  why => sub ($) { say 42 };
Metamodel::Primitives.install_method_cache($type%methods:authoritative);
$type.why;      # 42 
$type.list;
CATCH { default { put .^name''.Str } };
# OUTPUT: «X::Method::NotFound: Method 'list' not found for invocant of class 'why oh why?'␤»

每个元对象都有容纳参数化缓存的能力。这不同于支持参数化语法的 parameterize 元方法。例如,一个包可以从这个低级意义上来说是参数化的

package Cache {
    our sub parameterize(+argsis raw {
        Metamodel::Primitives.parameterize_type: $?PACKAGEargs
    }
 
    sub noop(MuMu \argsis raw {
        args
    }
 
    BEGIN Metamodel::Primitives.set_parameterizer: $?PACKAGE&noop;
}

方法§

方法 create_type§

method create_type(Mu $how$repr = 'P6opaque')

从元对象 $how 和表示名称创建一个新类型并返回它。

方法 set_package§

method set_package(Mu $type$package)

设置与该类型关联的包。

方法 install_method_cache§

method install_method_cacheMu $type%cache:$authoritative = True)

安装方法缓存,即从方法名称到代码对象的映射。如果 :authoritative 缺失或设置为 True,则调用缓存中不存在的方法将抛出类型为 X::Method::NotFound 的异常。如果 :authoritative 设置为 False,则尝试通常的回退机制。

方法 configure_type_checking§

method configure_type_checkingMu $type@cache:$authoritative = True:$call_accepts = False )

配置 $type 的类型检查。@cache 是已知类型的列表,$type 对其进行正向检查(因此在经典的基于类的系统中,类型本身和所有递归超类)。如果 :authoritative 缺失或为 True,则此类型将对 @cache 中不存在的所有类型检查失败。如果 :call_accepts 为 True,则将为针对此类型的类型检查调用方法 ACCEPTS

方法 configure_destroy§

method configure_destroy(Mu $type$destroy)

配置当垃圾回收器收集此类型的对象时是否调用 DESTROY 方法(如果 $destroy 设置为真值)。这会带来性能开销,因此只有在必要时才应将其设置为真值。

方法 compose_type§

method compose_type(Mu $type$configuration)

组合 $type(即,将其最终确定为可实例化)。有关 $configuration 可以包含的内容,请参阅 https://github.com/Raku/nqp/blob/master/docs/6model/repr-compose-protocol.markdown(抱歉,在有更好的文档之前)。

方法 rebless§

method rebless(Mu $objectMu $type)

$object 更改为类型 $type。仅当 $type$object 的当前类型进行类型检查,并且 $object 的存储是 $type 的子集时,此方法才有效。 [1]

方法 is_type§

method is_type(Mu \objMu \type --> Bool:D)

objtype 进行类型检查

方法 set_parameterizer§

method set_parameterizer(Mu \obj&parameterizer --> Nil)

初始化元对象的参量化缓存。这合并了 &parameterize 例程以生成要缓存的参量化。假定它带有与 :(Mu $root, List:D $args) 兼容的签名,其中 $root 是参量化的基本元对象,$args 是类型参数的对象缓冲区。

方法 parameterize_type§

method parameterize_type(Mu \obj+parameters --> Mu)

使用 parameters 对由 set_parameterizer 准备的元对象进行参量化。生成的元对象通过与 parameters 的每个元素进行文字对象比较(=:=)进行缓存。容器往往会使任何匹配无效

方法 type_parameterized§

method type_parameterized(Mu \obj --> Mu)

根据其结果 obj 从参量化返回基本元对象。如果从未执行过,则返回 Mu

方法 type_parameters§

method type_parameters(Mu \obj --> List:D)

根据其结果 obj 从参量化返回类型参数的对象缓冲区。如果从未执行过,则终止。

方法 type_parameter_at§

method type_parameter_at(Mu \objInt:D \idx --> Muis raw

根据其结果 obj 和索引从参量化返回特定对象,跳过 type_parametersList 构建步骤。如果从未执行过,则终止。

1 [↑] 从 Raku 2019.11 开始,此方法需要 特殊安排