Объявление "нативных" типов в Perl 6 - PullRequest
0 голосов
/ 04 июля 2018

В модуле natives.pm6 многие собственные типы объявлены следующим образом:

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 голосов
/ 04 июля 2018

Декларатор пакета native - это деталь реализации компилятора Rakudo Perl 6, а не часть языка Perl 6. Необходим некоторый механизм для выражения взаимосвязи между языковой средой исполнения и типами, такими как int32 и num64, объявленными в стандартной библиотеке Perl 6. Для нативного типа был необходим мета-объект другого типа, и поскольку деклараторы пакетов (например, class и role) работают, будучи привязанными к мета-объектам определенного типа, введение для этой цели декларатора пакетов native отличный способ запустить этот бит системы типов Perl 6.

Использование native вне стандартной библиотеки никогда не было предназначено (что я могу сказать с уверенностью, потому что я изобрел механизм). Учитывая чувствительность к производительности нативных типов, разработчикам компилятора Perl 6, скорее всего, следует дать максимальную свободу выбора их определения и уточнить это с течением времени. Нет уверенности в том, что декларатор native будет существовать вечно в Rakudo, и что любые будущие разработчики компиляторов Perl 6 будут делать то же самое.

Если вам нужен псевдоним для имени собственного типа, просто используйте constant:

constant smallish = int;

Поскольку constant вычисляется во время компиляции, этот символ может использоваться точно так же, как и любой другой тип. В native нет функциональности, которая недоступна для типов, доступных в Perl 6 или библиотеке NativeCall.

...