在natives.pm6
module中,许多本机类型都以这种方式声明:
my native int is repr('P6int') is Int { }
您显然可以以相同的方式使用它,
my native smallish is repr('P6int') is Int is nativesize(8) { };
say smallish.^mro; # OUTPUT: «((smallish) (Int) (Cool) (Any) (Mu))»
显然,您需要native
来指定一个表示形式,因为如果不使用native
,该表示形式将会失败。与is repr
相同,因此它们并存。但是,这只是行为观察。
但是,除了实现中的那些示例之外,我没有找到任何有关何时何地使用native
的文档。任何帮助将不胜感激。
答案 0 :(得分:11)
native
包声明符是Rakudo Perl 6编译器实现的详细信息,而不是Perl 6语言的一部分。需要某种机制来表达语言运行时与Perl 6标准库中声明的类型int32
和num64
之间的关系。本机需要不同类型的元对象,并且由于程序包声明符(如class
和role
)通过映射到特定类型的元对象而工作,因此引入了native
为此,软件包声明程序是一种引导Perl 6类型系统的精巧方法。
从来没有打算在标准库之外使用native
(我可以放心地说,因为我发明了该机制)。考虑到本机类型对性能的敏感性,应该给Perl 6编译器开发人员最大的自由,以便他们选择定义方式,并能够随着时间的推移对其进行改进。不确定native
声明符将永远存在于Rakudo中,也不确定任何未来的Perl 6编译器开发人员将选择以相同的方式进行操作。
如果要为本机类型名称添加别名,只需使用constant
:
constant smallish = int;
由于constant
是在编译时求值的,因此可以像使用其他任何类型一样使用此符号。通过native
没有可用的功能,而Perl 6或NativeCall
库中可用的类型尚未提供这些功能。