Константы перегрузки в Perl 6


Можно ли перегружать константы в Perl 6? Вот пример Perl 5, который я рассматриваю.

В частности, я хотел бы получить строку используемого литерального значения, например, если код был

my $x = .1e-003 ;

Мне нужен ".1e-003" вместо 0.0001.

3 4

3 ответа:

Я только что добавил такой модуль:

Https://github.com/FROGGS/p6-overload-constant

Использование:

use v6;
sub decimal { $^a.flip }
use overload::constant &decimal;

say .1e-003 # "300-e1."

Вы можете изменить способ формирования строки значения, смешав соответствующую роль с but оператор, ie

0.0001 but role { method Str { ".1e-003" } }

Который можно сократить до

0.0001 but ".1e-003"

Обратите внимание, что предоставление метода Stringy вместо того, чтобы Str возможно, на самом деле это было бы более уместно с семантической точки зрения, но я не думаю, что Ракудо на сегодняшний день правильно обрабатывает это различие во всех случаях.

Я не думаю, что что-либо подобное overload::constant существует в спецификации или существующих библиотеках, но это должно быть возможно написать его с помощью макросов, посмотрев в AST на тип литерала, который вас интересует, и заменив его конструктором объекта или чем-то еще, что вам нужно.

Более чистым, возможно, было бы обернуть каждую из этих констант в вызов макроса, вместо того, чтобы охватывать всю программу одной.