在Perl 6中声明“本机”类型

时间:2018-07-04 16:05:53

标签: perl6 nativecall

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的文档。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:11)

native包声明符是Rakudo Perl 6编译器实现的详细信息,而不是Perl 6语言的一部分。需要某种机制来表达语言运行时与Perl 6标准库中声明的类型int32num64之间的关系。本机需要不同类型的元对象,并且由于程序包声明符(如classrole)通过映射到特定类型的元对象而工作,因此引入了native为此,软件包声明程序是一种引导Perl 6类型系统的精巧方法。

从来没有打算在标准库之外使用native(我可以放心地说,因为我发明了该机制)。考虑到本机类型对性能的敏感性,应该给Perl 6编译器开发人员最大的自由,以便他们选择定义方式,并能够随着时间的推移对其进行改进。不确定native声明符将永远存在于Rakudo中,也不确定任何未来的Perl 6编译器开发人员将选择以相同的方式进行操作。

如果要为本机类型名称添加别名,只需使用constant

constant smallish = int;

由于constant是在编译时求值的,因此可以像使用其他任何类型一样使用此符号。通过native没有可用的功能,而Perl 6或NativeCall库中可用的类型尚未提供这些功能。