在 Perl 6 中声明 "native" 类型

Declaring "native" types in Perl 6

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

native 包声明符是 Rakudo Perl 6 编译器实现细节,而不是 Perl 6 语言的一部分。需要某种机制来表达语言运行时与 Perl 6 标准库中声明的 int32num64 类型之间的关系。本地人需要一种不同类型的元对象,并且由于包声明符(如 classrole)通过映射到特定类型的元对象来工作,引入 native用于此目的的包声明符是 bootstrap Perl 6 类型系统的一种巧妙方式。

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

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

constant smallish = int;

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