在Perl 6中声明"本机"类型

jjm*_*elo 7 perl6 nativecall

在该natives.pm6模块中,许多本机类型以这种方式声明:

my native int is repr('P6int') is Int { }
Run Code Online (Sandbox Code Playgroud)

您显然可以以相同的方式使用它,

my native smallish is repr('P6int') is Int is nativesize(8) { };
say smallish.^mro; # OUTPUT: «((smallish) (Int) (Cool) (Any) (Mu))?»
Run Code Online (Sandbox Code Playgroud)

显然,您需要native指定一个表示,因为如果native不使用它将失败.同样的is repr,所以他们齐头并进.然而,这只是一种行为观察.

但是,native除了实现中的这些示例之外,我还没有找到任何何时何地使用的文档.任何帮助将不胜感激.

Jon*_*ton 11

所述native包声明符是一个Rakudo Perl 6的编译器实现的细节,而不是Perl 6语言的一部分.需要一些机制来表达语言运行库和类型等之间的关系int32,并num64在Perl 6的标准库中声明.本机需要一种不同类型的元对象,并且由于包声明器(如classrole)通过映射到特定类型的元对象来工作,native因此为此目的引入一个包声明器是一种巧妙的方法来引导该位的Perl 6型系统.

native从来没有打算使用标准库以外的东西(我可以放心地说,因为我发明了这种机制).鉴于本机类型的性能敏感性,Perl 6编译器开发人员应该有最大的自由选择他们如何定义它们,并能够随着时间的推移进行优化.无法确定native声明器将永远存在于Rakudo中,也不确定任何未来的Perl 6编译器开发人员将选择以相同的方式执行操作.

如果想要一个本地类型名称的别名,只需使用constant:

constant smallish = int;
Run Code Online (Sandbox Code Playgroud)

由于constant在编译时进行评估,因此可以像使用任何其他类型一样使用此符号.没有可用的功能native,Perl 6或NativeCall库中可用的类型尚未公开.