LINUX.ORG.RU

Две бесплатные книги по Raku от Андрея Шитова

 


4

3

Raku One-Liners: В этой книге, вы найдёте множество скриптов, коротких настолько что они могут быть записаны в одну строку. Седьмая глава познакомит с синтаксическими конструкциями Raku, которые помогут создавать лаконичные, выразительные и при этом полезные программы! Подразумевается, что читатель знает основы Raku и имеет опыт программирования.

Using Raku: Книга содержит набор задач и решений к ним на Raku. Полезна как тем кто изучает данный ЯП, так и преподавателям. Ранее книга называлась «Using Perl6», но данная версия не простая замена s/Perl6/Raku/g, а новое издание с исправлениями и дополнениями.

P.S. Книга бесплатная, но Андрей будет рад пожертвованиям.

★★★★★

Проверено: a1batross ()
Последнее исправление: a1batross (всего исправлений: 1)
Ответ на: комментарий от actionless

язык на основе JVM

вообще-то родной вариант это MoarVM

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

окей со сферой использования, предположим, определились

сейчас в бигдате в основном ява

есть бенчмарки в сравнении с ней? (всё-таки в этой сфере это один из самых важных показателей при выборе инструмента)

actionless ★★★★★
()
Ответ на: комментарий от actionless

подробнее (желательно с примерами) про:

http://jnthn.net/papers/2015-spw-nfg.pdf <- юникод, там есть примеры кода на C#, Java, Python 3.

Динамические переменные.

Почитай про dynamic scoping в вики.

Подмножества

Что-то типа такого:

subset Positive of Int where * > 0;
my Positive $hehe;
$hehe = 10; # ok
$hehe = -1; # oops
# Positive это обычный полноправный тип

не понял, зачем это, если можно сразу в виде класса и написать

Ты не совсем уловил идею. Фазеры позволяют выполнять код в определённое время.

BEGIN { say "Меня напечатают во время компиляции!" }
for @foo {
    LAST { say "Я обрабатываю последний элемент..." }
}
{
    my $test-server = Server.start;
    LEAVE $test-server.stop; # сокращение для LEAVE { $test-server.stop; }
    # ^ когда мы leave из блока, сервер остановят
}

react whenever $foo {
    ...
    DONE { say "Асинхронный поток закончился!" }
    QUIT { say "Произошло исключение..." }
}

Так понятней, что это за штука?

на первый взгляд очень похоже на threading Queue или что-то похожее, но я не уверен

http://jnthn.net/papers/2019-gpw-react-supply-whenever.pdf <- на пальцах рассказывают про react/whenever/supply. Ближайшее, что можно представить, это какой-нибудь RXJava, только на стероидах.

http://jnthn.net/papers/2019-perlcon-concurrency.pdf <- можешь открыть слайд 48 и увидеть там реальный пример, с объяснениями, сколько тривиальной головной боли он решает.

они даже во втором питоне были

➜  ~ python2
Python 2.7.16 (default, Jun 12 2019, 13:28:30) 
[GCC 8.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1 + 0.2
0.30000000000000004

под «2.0» или улучшенными ты ведь подразумеваешь «из Raku»?

Я имею в виду, что дизайнеры языка Perl, которые, наверное, знают PCRE лучше, чем кто-либо другой в мире, посмотрели на PCRE, перечислили косяки, и сделали ревизию. Читать это.

в качестве либы всегда был pyparse с очень похожей идеей

Идея похожая, но комбинаторный-like синтаксис...

тоже было еще в двойке: https://docs.python.org/2/library/itertools.html#itertools.count

Я про банальнейший foo++.

а в чем отличие от if/elsif/else?

Разные конструкции для разных вещей, проще читать. Нет смешивания понятий в одну кучу.

given 42 {
    when Int { say "I am int!" }
    when 42  { say "Cool, I am 42!" }
    when $_.abs == 0 { say "Sounds strange..." }
    when Str { say "I am str..." }
    when nobody-is-cool() { say "Nobody!" }
}

Ну и заранее избавляет от if a := foo() синтаксиса, который недавно добавили. Сперва были уверены, что ненужно, а потом вдруг выяснилось, что так просто удобней.

Lilly
()
Ответ на: комментарий от Lilly

Теперь пишу обещанное про недостатки. Как обычно, это всё субъективщина, ни на что не претендует и так далее. Сперва про недостатки, которые самого дизайна языка не касаются:

  • Ждать ещё несколько лет, пока производительность во всех сферах подтянут. В некоторых бенчмарках быстрее perl/ruby/python, в некоторых медленнее. Юзабельно уже сейчас, но это не прям ракета.
  • Либы не на все случаи жизни, либо вписываешь своё имя в историю за счёт убитых вечеров, либо ждёшь, пока кто-то сделает.
  • Не всегда удобно бывает установить на любой кофеварке, для винды, к примеру, выпускается только дистрибутив Rakudo Star, конпелять же руками это то ещё удовольствие.
  • Некоторые люди начинают гольфировать чисто из любви к гольфу. Вроде и не запретишь, пусть развлекаются, а с другой стороны посматриваешь с опаской на IOCCC.
  • Поддержка многими простыми редакторами не идеально вылизана, нет какого-нибудь server langauge protocol, есть IDE, но на неё тоже громадные планы на ближайший год-другой.

Всё это, как понятно, фиксится временем, сообществом, деньгами.

Теперь про сам язык:

  • Был один случай за много лет, когда "" и '' пальнули в ногу, т.к. во втором нет интерполяции. К счастью, IDE решает. Впрочем, с питоновским f() такое тоже возможно. А как люди решетят себя используя printf…
  • Юникодные операторы меня лично напрягают, к счастью, у них есть ASCII альтернативы.
  • С этим же связанное, есть heredocs и ещё десять способов использовать все юникодные скобки и все в мире навычки для того, чтобы писать строковые литералы. Кому-то нравится, я держусь подальше.
  • Для меня лично довольно запутанная иерархия методов, которые вызываются при построении объекта. Она дочерта супер-гибкая, но в этом её и трудность.
  • Контейнеры для переменных могут сперва сбивать с толку и кажется, что иногда поведение странное, хотя по сути оно внутренне-непротиворечиво.
  • Философия «Есть много путей» меня порой раздражает, например, есть 4 (!) валидных способа указать тип возврата функции. И хотя 95% времени ты видишь только один, когда нужно поддерживать в той же IDE все четыре… Или вот есть просто .map, а есть гипер-операторы, и их использование совершенно не эквивалентно, хотя может казаться, что это так.
  • Wrapping вместо питоновых декораторов это немного менее красиво и более локально, я так понимаю, хотя прям серьёзных сравнений я не делал, это нужно брать код какой-то и на него смотреть / сравнивать.
Lilly
()
Ответ на: комментарий от Lilly

http://jnthn.net/papers/2015-spw-nfg.pdf

я даже и не знал, что бывают ситуации когда нормализации для юникода недостаточно

Так понятней, что это за штука?

теперь да, но в питоне и так есть try/finally и try/except/else/finally

for @foo {
LAST { say «Я обрабатываю последний элемент...» }
}

сомнительный сахар по сравнению с

for @foo {
if ($_==@foo[-1]) { say «Я обрабатываю последний элемент...» }
}

given/when

ну в твоем примере я вижу то же самое, что и в том что нашел в интернете — он просто скрывает неявное `varname==` в каждом условии

>>> 0.1 + 0.2

но это же ведь float, а не fraction (про который ты спрашивал изначально), хотя и decimal тоже есть

Я имею в виду, что дизайнеры языка Perl, которые, наверное, знают PCRE лучше, чем кто-либо другой в мире, посмотрели на PCRE, перечислили косяки, и сделали ревизию. Читать это.

почему бы им тогда просто не сделать libpcre2 со всеми этими нововведениями, чтобы её можно было использовать отовсюду, в том числе и из пятого перла?

react/whenever/supply

пока не было времени почитать вдумчиво, но пролистав после 48-й страницы и почитав комментарии к коду так и не стало сильно ясно зачем придумывать было новые ключевые слова вместо просто if/else

actionless ★★★★★
()
Последнее исправление: actionless (всего исправлений: 1)

а есть в формате mobi или epub? или просто в формате txt?

pdf неудобно читать на телефоне

anonymous
()
Ответ на: комментарий от actionless

я даже и не знал, что бывают ситуации когда нормализации для юникода недостаточно

Вот видишь, узнал что-то новое.

теперь да, но в питоне и так есть try/finally и try/except/else/finally

Нет-нет, try/finally это совсем не то. Как ты запустишь с ним что-то только в конце или начале цикла? Но это ладно, можно просто написать код рядом, как ты будешь выполнять код во время компиляции? Подбирать конфиги ещё до запуска программы? А теперь что, если я скажу тебе, что можно писать кастомные фазеры?

сомнительный сахар по сравнению с

Теперь представь, что @foo ленивый и ты не можешь знать его размер. Представь, что ты можешь выполнять свой код во время компиляции / прекомпиляции, например генерировать метапрограммированием типы / код на основе конфигов.

но это же ведь float, а не fraction (про который ты спрашивал изначально), хотя и decimal тоже есть

По дефолту есть - нет - едем дальше.

почему бы им тогда просто не сделать libpcre2 со всеми этими нововведениями, чтобы её можно было использовать отовсюду, в том числе и из пятого перла?

У них спроси.

пока не было времени почитать вдумчиво
просто if/else

Почитай внимательней, видимо, мысль совсем не была донесена. Где if/else даст тебе подписки на observable объекты? Где оно будет композабельным? Как ты вынесешь их обработку из текущего потока при необходимости? В каком месте у тебя появится семантика для многопоточных вызовов? Нет-нет, ты можешь это всё наворотить руками (правда, тебе понадобится побольше, чем простой if), но удачи, надеюсь, в каждом случае ни разу ничего не забудешь закрыть руками и помолишься, чтобы нигде не было гонки.

Аргумент «почему не if» выглядит странно. Можно это всё и на чистом С симулировать, не вопрос, другой вопрос, ты действительно хочешь это делать. Если ты уверен, что никогда не ошибаешься и упрощения жизни тебе не нужны, ведь всё можно наворотить руками и примотать синей изолентой - удачи.

Lilly
()
Ответ на: комментарий от anonymous

С вами снова мерзкий анонимус! Что не говори, но нейминг-то ужасен. А это не мелочи.

Самое интересное, в треде про переименование не только носители славянских языков высказали сомнения на счёт выбора, но и японского. В частности, было отмечено, что перевод (Raku) кривой и невтемный, от человека, который знаком с японским по аниме.

anonymous
()
Ответ на: комментарий от actionless

Норм бенчей не нашел, из того что понятно на вскидку - у MoarVM старт существенно быстрее, памяти жрет много меньше. У жабки jit отполирован лучше. Где узкие места так сразу и не сказать, надо пробовать запилить что-то боевое и там уже разгребать по факту.

olelookoe ★★★
()
Ответ на: комментарий от Lilly

Аргумент «почему не if»

я не могу понять, что мешает, например, объявить подключение через класс (ну и в его деструкторе соответственно его убивать) и if будет выглядеть типа `if connection.react('this') {} elif connection.react('that') {}`

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

Нет-нет, try/finally это совсем не то

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

ну и плюс для конца цикла есть еще `if/else` (где else выполняется после последнего элемента, т.е. переменная цикла содержит как раз последний элемент

actionless ★★★★★
()
Последнее исправление: actionless (всего исправлений: 1)
Ответ на: комментарий от anonymous

Выражение «раковать» заиграло новыми красками!

«ракувать»)))

beck ★★★★
()
Ответ на: комментарий от enso

На логотипе бабочка с лицом пчелы, которая говорит «ЗАТЕМ»

aspotashev ★★★
()
Ответ на: комментарий от actionless

фибоначчи плохая задача для параллелинга. Разве что запилить ради оценки стоимости распареллеливания, реализовав максимально тупо и в лоб? Ну хз. Попробую жизненный бенч какой-нибудь придумать, пока нет идей.

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

То есть вы с Лилей надрачиваете на мегафичи нескучного перла, но где их применить не можете придумать. Годные адепты чо. Лиля вообще говорит баззвордами, совсем тяжелый случай.

anonymous
()

Решил полистать я значит вторую книгу, вижу такой код:

my $filename = 'file0.txt';
for 1..5 {
 $filename++;
 say $filename;
}
Это какая то черная магия. Как раку вообще это разруливает? Решил запихнуть цифру в начало и восторг немного уменьшился, но не пропал
0filf.txt
0filg.txt
0filh.txt
0fili.txt
0filj.txt

snake266 ★★
()
Ответ на: комментарий от snake266

Это какая то черная магия

Инкремент строки – бессмыслица. Вот и решили запилить такой «умный» алгоритм, что бы не пропадала зря языковая конструкция (ИМХО)

fingolfin
()
Ответ на: комментарий от fingolfin

Прекрасная иллюстрация почему перл сдох. Два быдлокодера рассуждают о поведении лексикографических операторов: «магия», «бессмыслица», «умный алгоритм»...

Айти которое мы заслужили, грёбанный стыд.

anonymous
()
Ответ на: комментарий от Lilly

Ну да, у Raku в сравнении с Common Lisp есть одно очевидное критическое преимущество (сложный синтаксис) и один очевидный критический недостаток (сложный синтаксис).

Gentooshnik ★★★★★
()
Ответ на: комментарий от Gentooshnik

Отличие в том, что у CL есть приличные реализации, а сабжевая скриптопараша сливает даже рубям.

anonymous
()
Ответ на: комментарий от Lilly

Поясните мне тупому чем код с мультиметодами на Common Lisp принципиально отличается от того что я могу реализовать на С++? Что там такого мультиметодичного чего нет в плюсах? Да, в плюсах мне некий defgeneric делать не приходится, в отличие от.

A-234 ★★★★★
()
Ответ на: комментарий от aol

Так вот для чего его переименовывали?! :-D :-D :-D

По теме: от перемены названия ненужно нужнее не становится.

zabbal ★★★★★
()
Ответ на: комментарий от actionless

Код то показал? Или опять убежал в кусты?

anonymous
()
Ответ на: комментарий от A-234

Не знаком близко с CL, не скажу. Но очевидный момент в том, что одно тебе нужно реализовывать руками, а другое «просто работает». Т.к. любой высокоуровневый код так или иначе выполняется на процессоре, что угодно из высокоуровневого ты можешь хоть в машинном коде забить, не вопрос. Поэтому это нечто из разряда «Чем if-ы принципиально отличаются от того, что я могу реализовать на jmp-ах и метках?».

Кому нужен С++ и он в своей области рулит и педалит - те пишут на С++ и довольны, не вижу конфликта интересов.

Lilly
()
Ответ на: комментарий от Lilly

Если присмотреться, код на Raku делает _гораздо_ больше вещей, чем код на Java, Причём с комментариями всех фич.

Из данного примера это не видно (или я не туда смотрю). Метод collideWith(final Collideable other) в интерфейсе Collideable выглядит искуссвтенно, поскольку в примере методы делают разное. Зачем он нужен?

alt-x ★★★★★
()

Я мимокрок, ребята. Вы чего к гражданину пристали? Не нравится Raku? Зачем тратите своё время? Могли вместо срача полистать книжку эквивалентное к-во времени и твёрдо понять нужен ли вам данный язык.

Добра! 359/Perl11

perl5_guy ★★★★★
() автор топика
Ответ на: комментарий от Lilly

Я про другое. На плюсах это все выглядит примерно вот так:

#include <iostream>

using namespace std;

class Asteroid {
};

class Spaceship {
};


void collide(const Asteroid& x, const Asteroid& y)
{
    cout << "AA" << endl;
}

void collide(const Asteroid& x, const Spaceship& y)
{
    cout << "AS" << endl;
}

void collide(const Spaceship& x, const Asteroid& y)
{
    cout << "~";
    collide(y,x);
}

void collide(const Spaceship& x, const Spaceship& y)
{
    cout << "SS" << endl;
}

int main(int argc, char** argv)
{
    Asteroid a;
    Spaceship s;
    collide(a,a);
    collide(a,s);
    collide(s,a);
    collide(s,s);
    return 0;
}

Что тут нужно было «делать руками» такого чего не нужно делать в том же rust или cl?

A-234 ★★★★★
()
Ответ на: комментарий от perl5_guy

Я полистал Using Raku, что-то не вштырило. На фоне божественного Perl Cookbook смотрится бледновато. Но учитывая, что это бесплатная книга, автор молодец конечно. Язык слишком вырвимозгный для такого дебила как я, так что остаюсь на perl5 (будто у меня был выбор и это кому-то интересно бггг). Яйцеголовым удачи! Завидую вам, парни.

bread
()
Ответ на: комментарий от bread

Я уже говорил что не нужно мыслить бинарно. Я вот ковыряю javascript и Rust, теперь пожалуй Raku тоже буду. А Perl так вообще любовь моя и кормилец. Жаль что в сутках только 24 часа :'(

perl5_guy ★★★★★
() автор топика
Ответ на: комментарий от perl5_guy

Это как по-русски и по-украински одновременно говорить, полная пурга в голове. Я выбрал русский, а украинский стёр, чтобы не мешался. Ракудо слишком похож на перл, это напрягает. И еще, динамическая типизация подзадолбала, хочу чтобы компилятор делал мне больно.

bread
()
Ответ на: комментарий от alt-x

Из данного примера это не видно (или я не туда смотрю)

Может не туда куда-то смотришь. Навскидку в коде на Raku использованы подмножества, роли, показаны атрибуты (поля), показана инициализация строк, определены кастомные операторы сравнения, использован кастомный диспатчер для того, чтобы задать constraint на «Кидай сюда только объекты, а не объекты и объекты типов», where-выражения в сигнатурах. Тогда как в примере на Java показан интерфейс, классы и определение метода. Поэтому создаётся впечатление, что в коде на Raku там какие-то звёздные войны происходят с этими астероидами.

Метод collideWith(final Collideable other) в интерфейсе Collideable выглядит искуссвтенно, поскольку в примере методы делают разное. Зачем он нужен?

Это у джавистов спроси, они расскажут. ;)

Lilly
()
Ответ на: комментарий от A-234

Что тут нужно было «делать руками»

Для начала не сравнивать вызовы функций с вызовами методов, не? В С++ я совсем почти никакой, но ты всегда можешь пообщаться с копипастой просто погуглив ничто вроде «C++ multi methods».

Lilly
()
Ответ на: комментарий от Lilly

Для начала не сравнивать вызовы функций с вызовами методов, не?

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

A-234 ★★★★★
()
Ответ на: комментарий от A-234

Нет, ты не понял. Тебе же подсказали, у мультиметодов динамический диспатчинг по двум и более объектам, а у тебя его вообще нет.

anonymous
()
Ответ на: комментарий от Lilly

определены кастомные операторы сравнения

В какой строчке они определены?

Это у джавистов спроси, они расскажут. ;)

Дык, я и есть джавист ;-) (который 15-20 лет назад писал на перле). Не вижу я, как этот метод может кому-то помочь.

alt-x ★★★★★
()
Ответ на: комментарий от alt-x

В какой строчке они определены?

# We add multi candidates to the numeric comparison operators because we are comparing them numerically,
# but makes no sense to have the objects coerce to a Numeric type.
# ( If they did coerce we wouldn't necessarily need to add these operators. )
# We could have also defined entirely new operators this same way.
multi sub infix:« <=> » ( Stellar-Object:D $a, Stellar-Object:D $b ) { $a.mass <=> $b.mass }
multi sub infix:« < » ( Stellar-Object:D $a, Stellar-Object:D $b ) { $a.mass < $b.mass }
multi sub infix:« > » ( Stellar-Object:D $a, Stellar-Object:D $b ) { $a.mass > $b.mass }
multi sub infix:« == » ( Stellar-Object:D $a, Stellar-Object:D $b ) { $a.mass == $b.mass }

^ вот здесь.

Lilly
()
Ответ на: комментарий от alt-x

Эм... Перечитай исходную ветку.

Изначально человек сказал, что любой код на Raku в 5 раз больше и хуже, чем. Я попросил пример. В пример привели статью из википедии, где код на Java это верх лаконичности:

https://en.wikipedia.org/wiki/Multiple_dispatch#Raku <- код на Raku, о котором идёт обсуждение

https://en.wikipedia.org/wiki/Multiple_dispatch#Java <- код на Java

Я сказал, что это некорректное сравнение, потому что в коде по ссылке на Raku гораздо больше вещей сделано (что и показано). Если же его переписать с таким же количеством вещей, как и в Java, будет тоже самое по размеру и даже меньше. Исходный комментатор про «в 5 раз больше» исчез с радаров, когда стало ясно, что сказанул 4.2, а ты стал придираться к коду на Java, который я скопипастил из википедии (и писал его не я), чтобы было наглядное сравнение. Так виднее? :)

Lilly
()
Ответ на: комментарий от Lilly

Только залили. Может интересно будет: https://www.youtube.com/watch?v=Hxi_rsrtY4Q

Алсо, можно на выходных норм новость совместно запилить про LWP. Я в толксах создавал тред, но там 1.5 коммента. Стараюсь пилить перлоновости для популяризации перлодвижухи.

perl5_guy ★★★★★
() автор топика
Последнее исправление: perl5_guy (всего исправлений: 1)
Ответ на: комментарий от perl5_guy

Поставил плюс ему в карму только что. Код крутой и идиоматичный, а вот документации мало, полировать надо, Никак не выдеру пару вечеров, чтобы подмогнуть.

Стараюсь пилить перлоновости для популяризации перлодвижухи

Тут у меня смешанные чувства: с одной стороны уровень технической непредвзятости (а иногда и подкованности) на лоре достаточно низкий, что снижает ценность любых ответов практически до нуля. Но он не нулевой, поэтому я всё равно стараюсь отвечать когда у людей есть конкретные вопросы по теме, ну и если вижу совсем уже 4.2. Полтора землекопа, которые оценивают инструменты по их фактическим свойствам, а не ярлыкам «слышал звон, не знаю где», и так в курсе, остальных убеждать бесполезно, люди меняют свои точки зрения гораздо реже, чем думают, даже если лицом ткнуть в факты. Лучше какой-нибудь блог завести и туда писать, хоть индексируется.

Или написать и отправить патч, написать туториал, проверить документацию, написать либу, написать тестов... Ну ты понял идею. Маркетинг это хорошо и это очень полезно, но конкретно здесь ломать копья я не вижу смысла для себя. Даже в богомерзком твиттере порой ответишь человеку и он поймёт, что ты пытаешься донести, или аргументирует в ответ, хотя казалось бы. Может не прав, конечно, выборка субъективная, но я бы предпочёл места без прямых попыток оскорбить по юзерпику хотя бы. :D

Lilly
()

А на русском по Raku есть книги?

Satori ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.