Перегрузка констант в Perl 6

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

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

my $x = .1e-003 ;

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


person user2660278    schedule 15.11.2014    source источник
comment
Вы можете приблизиться с помощью $x.perl, что приведет к 0.0001e0. На самом деле, если это то, что вы хотите, может быть лучше сохранить его в виде строки и просто использовать его как число там, где вам нужно.   -  person Brad Gilbert    schedule 15.11.2014
comment
вы можете использовать sprintf для форматирования его в научной нотации (если вам нужен строковый метод), но подход Брэда Гилберта, вероятно, лучше.   -  person bytepusher    schedule 15.11.2014
comment
Я думаю, что пример, который я привожу, слишком специфичен. Общее намерение состоит в том, чтобы иметь возможность перегружать константы в Perl 6. Уникальность overload::constant заключается в том, что он дает мне необработанную строку до того, как будет выполнена какая-либо интерпретация/упрощение.   -  person user2660278    schedule 15.11.2014


Ответы (3)


Я просто добавил такой модуль:

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

ПРИМЕНЕНИЕ:

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

say .1e-003 # "300-e1."
person Tobias Leich    schedule 16.11.2014
comment
Я использую его как обычный модуль Perl? Я получаю Null PMC access in get_bool(). Я использую Rakudo с Parrot, собранным из исходников. - person user2660278; 18.11.2014
comment
Я только что протестировал его на rakudo на Moarvm. (который в любом случае строится и работает быстрее). Но я также протестирую его на Parrot и JVM и, надеюсь, скоро выложу патч. - person Tobias Leich; 19.11.2014
comment
Большое спасибо. Это прекрасно работает. Я также пытался вернуть объект и получить 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 на сегодняшний день правильно обрабатывает это различие во всех случаях.

person Christoph    schedule 16.11.2014

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

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

person hobbs    schedule 15.11.2014
comment
Это выглядит интересно. Например, я получаю объект AST с my $ast = quasi { 1+2 } ;, но не могу найти, как действовать дальше. В нем говорится здесь, что API еще не определены, поэтому, возможно, в данный момент это невозможно. . - person user2660278; 16.11.2014