Вывод типа Perl 6 - PullRequest
       8

Вывод типа Perl 6

0 голосов
/ 24 мая 2018

Дано:

sub abc(Int $n) { say $n }

Если мы передадим переменную с типом Str в abc, мы получим ошибку времени компиляции:

my Str $s = "123";   abc $s;

Если мы передадим нетипизированныйпеременная, которая содержит строку, мы получаем ошибку времени выполнения:

my $s = "123";   abc $s;

C ++ поддерживает ключевое слово auto, которое допускает вывод типа.

Можно ли определить что-то вроде autoв Perl 6 такое, что:

auto $s = "123";

приведет к тому, что $s будет напечатано как Str?

Т.е. тогда мы сможем сделать следующее:

auto $s = "123";   abc $s;

И получите ошибку во время компиляции.

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

То, что вы ищете, вероятно, это то, что мы называем алломорфами в Perl6, типами, которые могут вести себя по-разному в зависимости от контекста.Для конкретного случая, который вы опубликовали, есть IntStr allomorph :

sub abc(Int $n) { say $n }
my IntStr $s = <123>;
abc $s; # prints 123

(Обратите внимание, что для него нужны кавычки <> вместо обычного"").Алломорфы, в общем, являются подклассами классов, в которые они могут быть типизированы;IntStr подклассы Int и Str.Это можно сделать в целом для любых типов, которые вы хотите auto, если они взаимно конвертируемы.

Другой вариант, если вы уже знаете, что собираетесь получить и во что он превращается., означает использовать приведение :

sub bcd(Int(Str) $n) { say $n }
my $t = "123";
bcd $t; # prints 123

В этом случае строка будет приведена к Int в Capture перед использованием подпрограммойbody.

Наконец, вы можете использовать контекстуализатор чисел , если вы используете, когда переменная будет эффективно использоваться.

sub efg($n) { say +$n }
my Int $u = 123;
my Str $v = "123";
efg $u;
efg $v;

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

sub xyz($n where $_ ~~ Int | Str ) { say +$n }
xyz $u;
xyz $v;
xyz $t;
xyz $s;

(он использует переменные, определенные выше). Здесь это будет работать независимо от того, не имеет ли переменнаяназначенный тип (например, $t, или был определен как IntStr, Int или Str).До тех пор, пока он может быть сопоставлен с Int или Str, он будет подан в подсистему и преобразован в число посредством контекстуализации.

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

0 голосов
/ 17 июля 2018

Я просто хочу упомянуть Прокси .Они работают на уровне контейнера и только во время выполнения.Но дайте некоторую возможность контролировать или отслеживать, что входит в переменную.

sub auto($v?) is rw {
    my $val = $v;
    Proxy.new(
        FETCH => -> $, { $val },
        STORE => -> $, $new-val {
            die "You canna change type from {$val.WHAT.^name} to {$new-val.WHAT.^name}"
                unless $new-val.WHAT ~~ $val.WHAT;
            $val = $new-val;
        }
    )
}

my $i := auto(11);
$i = 69;
say $i;
$i = 'blah'; # Boom

Proxys может использоваться для реализации чего-то типа auto, но только во время выполнения и только на уровне контейнера.Они также не настолько водонепроницаемы, так как контейнер, связанный с переменной, может измениться.Например, используя оператор bind :=

$i := 'he he'; # changed container
0 голосов
/ 24 мая 2018

Можно ли определить что-то вроде auto в Perl 6

Я думаю, что-то вроде.Но мне придется перевести ваш вопрос на три разных вопроса, чтобы дать более полезный ответ.

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

Можно ли изменить язык Perl 6?

Да.

Вы можете более или менее произвольно изменить PerlЯзык «на лету» из пользовательского кода.

Процитируем точку с запятой из первой части комментария, который я связал выше:

  • Внутренние DSL на сленге, построенные с использованием грамматик, как внешний DSL, но смешанный со стандартной грамматикой Perl 6 через сленговый механизм.Эти DSL должны быть написаны так, чтобы они хоть как-то согласовывались со стандартной грамматикой Perl 6.Код, написанный в таких DSL, выглядит встроенным, неотличимым от обычного кода. Соответствующие слайды .

Цитата из последней части, которую я написал:

Хотя сленги могут быть реализованы ... они официально не поддерживаются ...и не так уж слабы, как должны быть.

Можно ли написать макросы времени компиляции, которые связываются с компилятором?

Да.

К сожалению, вы можете 'пока не определим макросы операторов, которые вам понадобятся для объявления переменных нового типа.Цитируя последний раздел в комментарии, который я связал выше:

"Предполагаемые варианты дизайна для ситуаций, когда вам нужен внутренний DSL, но он слишком синтаксически конфликтует со стандартным Perl 6, чтобы просто использовать пользовательские подпрограммы и операторы... написать макрос is parsed [или] написать сленг. Теоретически любой из них может анализировать любой синтаксис, который вы хотите. Но макросы is parsed не были загружены и выглядят так, как будто они год или трипрочь - они все еще просто концепция дизайна, обсуждаемая в 007 . "

Возможно ли внедрить новые идеи в Perl 6?

Да.

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

Я серьезно отношусь к этому последнему пункту.

Компилятор Rakudo Perl 6, конечно, с открытым исходным кодом.

Гораздо большеважно, что это в основном написано на Perl 6 .(И большая часть того, что не является Perl 6, это nqp, который в основном является подмножеством полного Perl 6.)

Заключение

Если вы можете написать некоторый базовый код Perl 6;готовы задать множество вопросов на IRC-канале freenode # perl6-dev ;и терпеливы;тогда вы сможете реализовать практически любую идею в Perl 6, и ваша идея auto кажется относительно простой.

(где, по словам «относительно», я представляю, что знающий основной разработчик может сделатьподтверждение концепции через несколько часов при условии, что я правильно понял проблемы, с которыми они столкнутся, и однажды, когда сленг и / или макросы будут более отшлифованы, возможно, это займет около часа.)

...