Константы перегрузки в Perl 6
Можно ли перегружать константы в Perl 6? Вот пример Perl 5, который я рассматриваю.
В частности, я хотел бы получить строку используемого литерального значения, например, если код был
my $x = .1e-003 ;
Мне нужен ".1e-003"
вместо 0.0001
.
3 ответа:
Я только что добавил такой модуль:
Https://github.com/FROGGS/p6-overload-constant
Использование:
use v6; sub decimal { $^a.flip } use overload::constant &decimal; say .1e-003 # "300-e1."
Вы можете изменить способ формирования строки значения, смешав соответствующую роль с
but
оператор, ie0.0001 but role { method Str { ".1e-003" } }
Который можно сократить до
0.0001 but ".1e-003"
Обратите внимание, что предоставление метода
Stringy
вместо того, чтобыStr
возможно, на самом деле это было бы более уместно с семантической точки зрения, но я не думаю, что Ракудо на сегодняшний день правильно обрабатывает это различие во всех случаях.
Я не думаю, что что-либо подобное
overload::constant
существует в спецификации или существующих библиотеках, но это должно быть возможно написать его с помощью макросов, посмотрев в AST на тип литерала, который вас интересует, и заменив его конструктором объекта или чем-то еще, что вам нужно.Более чистым, возможно, было бы обернуть каждую из этих констант в вызов макроса, вместо того, чтобы охватывать всю программу одной.