Можно ли перегружать константы в Perl 6? Вот пример Perl 5, который я рассматриваю.
В частности, я хотел бы получить строку используемого буквального значения, например. если код был
my $x = .1e-003 ;
Мне нужно ".1e-003"
вместо 0.0001
.
Можно ли перегружать константы в Perl 6? Вот пример Perl 5, который я рассматриваю.
В частности, я хотел бы получить строку используемого буквального значения, например. если код был
my $x = .1e-003 ;
Мне нужно ".1e-003"
вместо 0.0001
.
Я просто добавил такой модуль:
https://github.com/FROGGS/p6-overload-constant
ПРИМЕНЕНИЕ:
use v6;
sub decimal { $^a.flip }
use overload::constant &decimal;
say .1e-003 # "300-e1."
Null PMC access in get_bool()
. Я использую Rakudo с Parrot, собранным из исходников.
- person user2660278; 18.11.2014
Unknown QAST node type Bool
, но я попробую отладить это сам.
- person user2660278; 19.11.2014
Вы можете изменить способ преобразования значения, смешав соответствующую роль с оператором but
, т.е.
0.0001 but role { method Str { ".1e-003" } }
который можно сократить до
0.0001 but ".1e-003"
Обратите внимание, что предоставление метода Stringy
вместо Str
на самом деле может быть более подходящим с семантической точки зрения, но я не думаю, что Rakudo на сегодняшний день правильно обрабатывает это различие во всех случаях.
Я не думаю, что что-либо подобное overload::constant
существует в спецификации или существующих библиотеках, но должна быть возможность написать его с помощью макросы, ища в AST тип литерала, который вас интересует, и заменяя его конструктором объекта или чем-то еще, что вам нужно.
Возможно, чище было бы обернуть каждую из этих констант вызовом макроса, вместо того, чтобы охватывать всю программу одной.
AST
с my $ast = quasi { 1+2 } ;
, но не могу найти, как действовать дальше. В нем говорится здесь, что API еще не определены, поэтому, возможно, в данный момент это невозможно. .
- person user2660278; 16.11.2014
$x.perl
, что приведет к0.0001e0
. На самом деле, если это то, что вы хотите, может быть лучше сохранить его в виде строки и просто использовать его как число там, где вам нужно. - person Brad Gilbert   schedule 15.11.2014overload::constant
заключается в том, что он дает мне необработанную строку до того, как будет выполнена какая-либо интерпретация/упрощение. - person user2660278   schedule 15.11.2014