Metamodel::Primitives
提供低级操作,用于处理类型,而这些类型通常只能作为与实现相关的指令使用。这些基元可用作类方法。
以下是一个示例,它从 Int
类中窃取元模型实例,以创建一个自定义类型(通常,如果你处理低级内容,你会创建自己的元类),它允许仅调用一个名为 why
的方法
my Mu := Metamodel::Primitives.create_type(Int.HOW, 'P6opaque');.^set_name('why oh why?');my = why => sub ($) ;Metamodel::Primitives.install_method_cache(, , :authoritative);.why; # 42.list;CATCH ;# OUTPUT: «X::Method::NotFound: Method 'list' not found for invocant of class 'why oh why?'»
每个元对象都有容纳参数化缓存的能力。这不同于支持参数化语法的 parameterize
元方法。例如,一个包可以从这个低级意义上来说是参数化的
方法§
方法 create_type§
method create_type(Mu , = 'P6opaque')
从元对象 $how
和表示名称创建一个新类型并返回它。
方法 set_package§
method set_package(Mu , )
设置与该类型关联的包。
方法 install_method_cache§
method install_method_cache( Mu , , : = True)
安装方法缓存,即从方法名称到代码对象的映射。如果 :authoritative
缺失或设置为 True
,则调用缓存中不存在的方法将抛出类型为 X::Method::NotFound
的异常。如果 :authoritative
设置为 False
,则尝试通常的回退机制。
方法 configure_type_checking§
method configure_type_checking( Mu , , : = True, : = False )
配置 $type
的类型检查。@cache
是已知类型的列表,$type
对其进行正向检查(因此在经典的基于类的系统中,类型本身和所有递归超类)。如果 :authoritative
缺失或为 True
,则此类型将对 @cache
中不存在的所有类型检查失败。如果 :call_accepts
为 True,则将为针对此类型的类型检查调用方法 ACCEPTS。
方法 configure_destroy§
method configure_destroy(Mu , )
配置当垃圾回收器收集此类型的对象时是否调用 DESTROY
方法(如果 $destroy
设置为真值)。这会带来性能开销,因此只有在必要时才应将其设置为真值。
方法 compose_type§
method compose_type(Mu , )
组合 $type
(即,将其最终确定为可实例化)。有关 $configuration
可以包含的内容,请参阅 https://github.com/Raku/nqp/blob/master/docs/6model/repr-compose-protocol.markdown(抱歉,在有更好的文档之前)。
方法 rebless§
method rebless(Mu , Mu )
将 $object
更改为类型 $type
。仅当 $type
对 $object
的当前类型进行类型检查,并且 $object
的存储是 $type
的子集时,此方法才有效。 [1]
方法 is_type§
method is_type(Mu \obj, Mu \type --> Bool)
对 obj
和 type
进行类型检查
方法 set_parameterizer§
method set_parameterizer(Mu \obj, --> Nil)
初始化元对象的参量化缓存。这合并了 ¶meterize
例程以生成要缓存的参量化。假定它带有与 :(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)
根据其结果 obj
从参量化返回类型参数的对象缓冲区。如果从未执行过,则终止。
方法 type_parameter_at§
method type_parameter_at(Mu \obj, Int \idx --> Mu) is raw
根据其结果 obj
和索引从参量化返回特定对象,跳过 type_parameters
的 List
构建步骤。如果从未执行过,则终止。