Посмотрел на Perl6

Очень давно хотел посмотреть во что превратился Perl6 за те годы, что я его не видел. Посвятил четыре часа своей жизни на изучение. Что я хочу сказать, богатейший язык при беднейшей документации. Синтаксис, как и положено языку Perl, позволяет сделать одно и то же миллионом различных способом, 99% из которых нечитаемы.

Я в восторге.

К сожалению, не всё описанное в документации работает (например, lvalue метод substr класс Str у меня работать отказался), а кое-что работает ужасно медленно (я попытался в своём коде использовать замены через regexp, не дождался окончания работы программы).

Сегодня на «Хабре» появилась интересная статья, где описывался нормальный алгоритм Маркова для деления двух целых чисел с точностью 4 знака после запятой в унарной системе счисления. То есть: «|/||||» = 0.25, «||/|||» = 0.6666 и так далее.

Замены в статье уже описаны, осталось реализовать алгоритм (в заменах я поменял пустую строку на два апострофа: «''»). Привожу с сокращением списка замен:
use v6;

my $входная = '||/|||';
my @замены  = <%* *% %| %* *| ** |* t t* *t …тут просто замены через пробел… p^ '' p .FIN _ .FIN>;

loop {
    my $нашёл = Bool::False;
    my $начтонадо;

    for @замены -> $что, $начто {
        my $где = $входная.index($что);

        if defined $где {
            $нашёл = Bool::True;

            given $начто {
                when <''>  {
                    $начтонадо = ''
                }                                
                when /FIN/ {
                    ($начтонадо = $начто) ~~ s[FIN] = '';
                    $нашёл = Bool::False;
                }
                default    {
                    $начтонадо = $начто
                }
            }

            #`{
                К сожалению, lvalue метод не сработал:
                $входная.substr($где, $что.chars) = $начтонадо;

                выдаёт «cannot modify readonly value
            }

            $входная = $входная.substr(0, $где) ~ $начтонадо ~ $входная.substr($где + $что.chars);
            say $входная;
            last;
        }
    }
        
    last unless $нашёл;
}
END {
    $входная.say;
}
К сожалению, не удалось использовать итераторы, они недостаточно хорошо описаны, но кое-какое представление о синтаксисе получить можно.

Меня очень радует нативная поддержка Unicode, которая реализована куда глубже, чем в Python, к примеру, конструкция языка „>>“ можно быть заменена на „»“, в качестве ограничителей (например, многострочного комментария) можно использовать символы «「» и «」», а «say "Ⅰ".succ» правильно выдаёт «Ⅱ»).

Наворотили в языке много. Отдельной строкой — регулярные выражения. Синтаксис совсем другой, мне кажется более продуманным, чем тот, что сейчас в Perl5 (и тем более в PCRE), возможностей стало больше, а выражения выглядят аккуратнее.
19 декабря 2010 03:28

Denis Ibaev (dionys.myopenid.com)
19 декабря 2010, 09:54

Пока что не существует полной реализации спецификации Perl 6, поэтому да, работать будет не всё. А документации на самом деле много, потому что, в отличие от Perl 5, язык сначала был описан. Кроме того есть как минимум одна книга, которая сейчас переводится на русский, и несколько русскоязычных сайтов.

bolk (bolknote.ru)
19 декабря 2010, 11:25, ответ предназначен Denis Ibaev (dionys.myopenid.com):

Пока что не существует полной реализации спецификации Perl 6, поэтому да, работать будет не всё. А документации на самом деле много, потому что, в отличие от Perl 5, язык сначала был описан.
В отличие от Perl5? Везде написано, что всё ровно наоборот: авторы плохо описали язык, так как хотели заняться реализацией.

Например: http://perl6.ru/articles/5to6/
Perl 6 еще недостаточно документирован. Не удивительно, потому что (в отличие от спецификации) написание компилятора для Perl 6 представляется гораздо более приоритетной задачей, чем написание документации, ориентированной на пользователя.
Ну и на perl6.org куча разделов объявлены как черновики или не описаны вовсе.

bolk (bolknote.ru)
19 декабря 2010, 14:34

Нашёл чьи-то заметки, человек изучает Perl6. Вот что пишет: http://perl6.su/nota_LXXXII.html
Пропустив октябрьский релиз, смотрим новый выпуск ракудо, 2010.11.
Сразу проверяем на производительность, складывая числа. Пятый перл за 0.146 секунды складывает числа от одного до миллиона. Шестой за… Я честно ждал 42 минуты, но так и не дождался. Утечка памяти замедлилась раз в сто, но есть.

Denis Ibaev (dionys.myopenid.com)
19 декабря 2010, 14:59, ответ предназначен bolk (bolknote.ru):

На самом деле наоборот, единственной спецификацией Perl 5 является та, что зашита в его интерпретатор. То есть всё, что можно скормить интерпретатору, не получив синтаксической ошибки, и есть Perl 5. Но, естественно, есть куча описаний того, что и как работает.

Perl 6 же начинался «на бумаге», поэтому прямо заявлено, что Perl 6 — это не какой-то конкретный интерпретатор/компилятор, а именно спецификация. Сейчас, из более чем десятка реализаций, наиболее полно спецификации соответствует Rakudo. Но если нужно лишь какое-то подмножество Perl 6, то возможно, рациональнее будет использовать какую-то другую реализацию.

Спецификация, правда, эта местами не дописана, да, но грамматика описана полностью. А с документацией же в виде книг, руководств и прочего и вовсе всё не так радужно как у Perl 5.

bolk (bolknote.ru)
19 декабря 2010, 15:16, ответ предназначен Denis Ibaev (dionys.myopenid.com):

Сейчас, из более чем десятка реализаций, наиболее полно спецификации соответствует Rakudo.
Я им и пользуюсь.
Спецификация, правда, эта местами не дописана, да, но грамматика описана полностью.
Я её смотрел, правда бегло. Не заметил, например, там описания синтаксиса регулярок. Впрочем, мог пропустить.

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

nudnik.ru (nudnik.ru)
19 декабря 2010, 16:50

$семкиесть
$аеслинайду

bolk (bolknote.ru)
19 декабря 2010, 17:12, ответ предназначен nudnik.ru:

Игра «Гопник» (http://bolknote.ru/2010/01/31/~2410/) на Perl6?

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)