Описание тега nativecall

Механизм Raku для вызова кода из установленных библиотек C. Ниже приведен полный пример, в котором для открытия окна сообщения используются установленные библиотеки C в Windows: используйте NativeCall; sub MessageBoxA(int32, Str, Str, int32) возвращает int32 is native('user32') { * } MessageBoxA(0, "У нас есть NativeCall", "ohai", 64);

Механизм Raku для вызова кода из библиотек C. Следующие примеры взяты с https://docs.perl6.org/language/nativecall.

Функция без аргументов:

use NativeCall;
sub some_argless_function() is native('something') { * }
some_argless_function();

Первая строка импортирует различные черты и типы. Следующая строка выглядит как относительно обычное под-объявление Perl 6 - с одной изюминкой. Мы используем черту "native", чтобы указать, что подпрограмма действительно определена в собственной библиотеке. Расширение для конкретной платформы (например, '.so' или '.dll'), а также любые стандартные префиксы (например, 'lib') будут добавлены для вас.

В первый раз, когда вы вызываете some_argless_function, будет загружена libsomething и в нем будет находиться some_argless_function. Затем будет сделан звонок. Последующие вызовы будут выполняться быстрее, так как дескриптор символа сохраняется.

Функция, которая принимает и возвращает типизированные аргументы:

use NativeCall;
sub add(int32, int32) returns int32 is native("calculator") { * }

Пример в Windows:

use NativeCall;

sub MessageBoxA(int32, Str, Str, int32) returns int32 is native('user32') { * }

MessageBoxA(0, "We have NativeCall", "ohai", 64);