LINUX.ORG.RU

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

 


4

3

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

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

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

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

побудить компании

компании не интересуются фичастостью ЯП. Компаниям нужен стабильный результат за вменяемые трудодни. И чтобы при поиске девелопера на вакантное место не залипать в прострации месяцев эдак на двенадцать.

побудить разработчиков

нравится ЯП - отсутствует нужная функциональность.

какие основные цели у Raku? вот у Perl6 цель была очень ясна, стать лучшим современным Perl

вот Raku и есть лучший современный Perl. Нет больше Perl6, есть Raku

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

Троллинг тупостью вроде должен был выйти из моды...

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

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

компании не интересуются фичастостью ЯП

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

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

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

на прямые вопросы съезжаешь по сторонам

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

повторю свой главный вопрос — в чем теперь цель этого языка, когда цель стать лучшей заменой перл5 перестала быть актуальной?

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

ты хочешь чтобы тебя тут бесплатно научили писать на нормальных языках?

«покупайте тайд! только мы вам не скажем чем он так божественно лучше других стиральных порошков. купите и протестируйте сами!»

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

И чтобы при поиске девелопера на вакантное место не залипать в прострации месяцев эдак на двенадцать.

это был еще один аргумент в пользу Raku?

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

по факту ситуация такова, что

тебе уже ответили на твои вопросы

в чем теперь цель этого языка

предоставить возможности, известные девелоперам, программирующим на других ЯП, но сделать эти возможности более легкими в применении. И обойтись без искусственных ограничений, присущих другим ЯП. Каких ограничений? Если язык в базе ООП, то ФП к нему прикручивается синей изолентой. И наоборот. Если ЯП изначально однопоточный скрипт, то многопоточность к нему прикручена болтиком.

Короче Raku позиционируется как труЪ мультипарадигменный язык, очень пластичный, легко мимикрирует под задачу.

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

это был еще один аргумент в пользу Raku?

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

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

ты хочешь чтобы тебя тут бесплатно научили писать на нормальных языках?

Единственный человек, который в этом треде показал код - это не ты.

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

еще один маркетолог в треде

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

пока я от вас, ребята, вижу только

1) голословные утверждения о преимуществах Raku над другими языками, основанные на его преимуществах над Perl5

2) перегрузка аргументов

3) либа для парсинга, которая в других языках выглядит почти так же но просто поставляется отдельно

4) кто-то считает что мультитрэдовый/мультипроцессный мап — это какие-то новейшие ракетные технологии (на самом деле нет)

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

Все просто. Ты же знаешь свой горячо любимый ЯП? Каждый ЯП чем-то хвалится. Все ЯП любят показывать свои супер короткие, супер понятные и супер эффективные хелловорлды. Ну так и похвались своим ЯП, покажи чем он хорош. Тебе в ответ дадут посмотреть на эквивалент написанный на Raku.

А все эти пофичные сравнения это ниачом. Интересно когда дело доходит до дела. В треде есть примеры кода на Раку - запили эквиваленты на своем любимом ЯП - обсудим.

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

Короче Raku позиционируется как труЪ мультипарадигменный язык

Короче как лисп, только с убер-синтаксисом, который без поллитры не разберешь. Чем хорош перл: можно одной строчкой доводить нубов до истерики. А сабж еще лучше в этом плане. Там просто перечисление доступных инфиксных операторов повергнет неофита в трепет.

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

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

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

Ну так и похвались своим ЯП, покажи чем он хорош

как минимум, количеством библиотек и размеров сообщества при сравнимых с Raku возможностями

тут даже не важно, какой язык взять, python, ruby или java

запили эквиваленты на своем любимом ЯП

мап который твой коллега выдал за якобы киллерфичу Raku есть в любом языке и точно так же пишется в одну строчку

на питоне ThreadPool/MultiprocessingPool

на руби нет специального сахара для этого, поэтому код будет где-то между «длинной» и «идиоматической» версиями на perl6

в яве есть всякие там ConcurrentHashMap и т.п. специально для такого

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

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

есть в любом языке и точно так же пишется в одну строчку

Показывай строчку.

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

количеством библиотек и размеров сообщества

это не ЯП, это экосистема и распространенность.

якобы киллерфичу Raku
Разве кто-то говорил, что это киллер-фича?

...ThreadPool...ConcurrentHashMap

ничего похожего ThreadPool(processes=4).map(fib, jobs) жабский ConcurrentHashMap не делает

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

Про HashMap там каша в голове, но если учитывать стримы, то там есть параллельность, другое дело, что их синтаксис, порождённый их прикручиванием сбоку и отсутствием нормальных лямбд, очень многословный с этим явным parallelStream()......collect(...), растягивается быстро.

Но всё-таки хотелось бы увидеть полные аналоги с импортами, поллингом результатов и всем добром.

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

Окей, если ты имел в виду, что так можно решить схожую задачу.

Но ConcurrentHashMap тут совсем не ближайший эквивалент и к тому же оверхед. Тут скорее нужен custom ThreadPool и parallelStream

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

Но всё-таки хотелось бы увидеть полные аналоги с импортами, поллингом результатов и всем добром

ну так и напиши их, ты же Raku-фанбой, который верит, что Raku чудесно лучше всего остального

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

Дождешься от них, как же.

Жаба.

import org.junit.Test;

import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.stream.Collectors;
import java.util.stream.LongStream;

import static junit.framework.TestCase.assertEquals;

public class testme {
    @Test
    public void giveRangeOfLongs_whenSummedInParallel_shouldBeEqualToExpectedTotal()
            throws InterruptedException, ExecutionException {

        long firstNum = 1;
        long lastNum = 1_000_000;

        List<Long> aList = LongStream.rangeClosed(firstNum, lastNum).boxed()
                .collect(Collectors.toList());

        ForkJoinPool customThreadPool = new ForkJoinPool(4);
        long actualTotal = customThreadPool.submit(
                () -> aList.parallelStream().reduce(0L, Long::sum)).get();

        assertEquals((lastNum + firstNum) * lastNum / 2, actualTotal);
    }
}

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

ты же Raku-фанбой, который верит, что Raku чудесно лучше всего остального

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

Всё очень просто: ты спросил, зачем оно нужно. Тебе кинули ссылок, показали код. Ты сказал «Мне ок с другими языками». Никто насильно ничего в горло тебе пихать не будет. Если для тебя неубедительно то, что тебе показали - у людей разные мнения, твоё мнение о ненужности окей, мнение того парня о нужности окей.

Как говорится, если тебе нравится шоколадное мороженое, а кому-то ванильное, бессмысленно идти в соседний подъезд и говорить «А вот ванильное фу, а докажи мне». Оке?

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

такой мелкий хитрец:

my @jobs = 0..100;

long firstNum = 1;
long lastNum = 1_000_000;

List<Long> aList = LongStream.rangeClosed(firstNum, lastNum).boxed()
.collect(Collectors.toList());

а как ты, интересно, то же самое на питоне напишешь,

@property
def first_num(self):
    result = int(1)
    return result

?

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

Тебе кинули ссылок, показали код. Ты сказал «Мне ок с другими языками».

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

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

Это у тебя аналог, эээ...

use Test;

my $first = 1;
my $last = 1_000_000;

my $total = sum $first..$last;

is ($last + $first) * $last / 2, $total, 'Equal!';

?

Сравнение не совсем корректное, т.к. sum на Range в raku оптимизирован, чтобы использовать формулу... Не уверен даже, как переписать так, чтобы с параллельностью. Типа такого: `(1..1_000_000).race(degree => 4, batch => 500).reduce(* + *)`, но оверхед от тредов больше, чем пользы здесь. В идеале escape analysis явы порежет инты полностью.

giveRangeOfLongs_whenSummedInParallel_shouldBeEqualToExpectedTotal

Вот сейчас жизненно было.

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

Вот сейчас жизненно было

long firstNum = 1;

вот только если это всё петросянство из его примера убрать — то получится почти то же самое что и тут на Raku: Perl 6 vs Python 3 (комментарий)

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

оверхед от тредов больше, чем пользы

Да пользы тут совсем никакой, один только вред ) Просто иллюстрация на тему «распараллелить на жабе».

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

Просто иллюстрация на тему «распараллелить на жабе».

И то верно.

Теперь нам нужны CAS в питоне.

А на джаве переопределить логику вызова метода.

И на руби запилить raku-compatible регулярки.

Вообще, самая главная строчка в этом всём:

Perl 6 unifies many great ideas that aren't usually found in other programming languages. While several other languages offer some of these features, none of them offer all of them.

Довольно понятно, что на любом тьюринг-полном можно выразить всё, что угодно на другом тьюринг-полном. Другой вопрос - сколько придётся с этим бороться.

Raku вряд ли серебряная пуля, хотя есть места, где ему не нужны сторонние библиотеки для того, чтобы не писать `"(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])«` ужасы, чтобы диспатчить методы, чтобы react/whenever... Если существует целая группа разных языков со своими плюсами и минусами, то непонятно, почему он не может к ней принадлежать, как просто ещё один инструмент.

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

по факту, если отбросить твои очень юмористические элементы в коде, вот что мы видим в сухом остатке:

LongStream jobs = LongStream.range(0, 100);
LongStream result = new ForkJoinPool(4).submit(() -> jobs.parallel().map(fib)).get();
my @jobs = 0..100;
my $results = @jobs.race(batch => 1, degree => 4).map({ fib($_) });

мда, такая колоссальная разница

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

вот только никакой адекватный человек не будет всё время держать в голове что означают все эти пупырки типа $_ => @ $$% ^&% &*(%(*&^&*(@#

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

Теперь нам нужны CAS в питоне.

А на джаве переопределить логику вызова метода.

И на руби запилить raku-compatible регулярки.

вот чего-то подобного я пытаюсь от тебя добиться — перечисли уникальные фичи языка по сравнению с python, ruby и java

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

Не, тут просто перебор с комментариями.

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

Уникальные фичи.

Человеческие регулярки, а не тот perl compatible ужас, который сейчас по факту используется во всех ЯП.

Регулярки и грамматики являются частью языка.

Полная поддержка юникода, без костылинга и грабелек.

Из этих трех изкоробочных (а не библиотечных) фич (которые присутствуют даже в напрочь обрезанном NQP) - широчайшие возможности по работе с текстами. + невообразимо легкий запилинг DSL. Нет ни одного ЯП, который был бы настолько адаптирован к работе с текстами.

Что касается сторонних библиотек - через NativeCall прикручивается практически что угодно из востребованного, и это не рокетсайнс. На практике это означает практический паритет по базирующихся на сишечке питонолибах, например.

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

Это то, что бросается в глаза при первом знакомстве. Личные впечатления, не претендующие на полноту.

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

На практике это означает практический паритет по базирующихся на сишечке питонолибах, например.

ты точно понимаешь разницу между теорией и практикой? если да, то где все эти либы которые сами написались?

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

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

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

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

Вопрос в другом - стоит ли писать новый софт, опираясь на Raku. Зависит от задачи. Числогрыз - нет. Геймдев - нет. Бизнес-логика? Облака? Нужно смотреть. Если ты приведешь пример реальной задачи - можно будет прикинуть среднепотолочно да или нет.

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

стоит ли писать новый софт

вот только для нового софта все равно нужны какие-то либы из предметной области

т.е. в первое время это дополнительные инвестиции рабочего времени

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

мда, такая колоссальная разница

Ты забыл определить fib, а потом, к примеру, для случая, когда этот fib может выбросить исключение… И тут начинаются проблемы.

вот чего-то подобного я пытаюсь от тебя добиться — перечисли уникальные фичи языка по сравнению с python, ruby и java

Ну давай попробуем… Фичи не в порядке важности,а в случайном порядке. Список не претендует на полноту и 100% надёжность. По сравнению с java:

  • Нет ООП в глотку, хочешь в функциональном, хочешь в процедурном.
  • Юникод на уровне графем из коробки.
  • Регулярки 2.0, которые можно складывать в грамматики не отходя от кассы.
  • Динамические переменные.
  • Есть роли, есть метаобъектный протокол.
  • Нет throws в сигнатурах
  • есть опциональные параметры, параметры с дефолтом, именованные параметры
  • Есть подмножества.
  • Мультиметоды по арности, типам, произвольно выполняемому коду…
  • Указание типов опционально.
  • Фазеры.
  • Композабельный react/whenever/supply
  • Нормальные промисы из коробки с await, без CompletableFuture и пяти реализаций одного и того же.
  • Лень, бесконечные списки.
  • Несколько версий либы одновременно.
  • Рациональные числа по дефолту.
  • Кастомные операторы.
  • Можно выполнять любой код во время разбора программы, во время компиляции…
  • given/when
  • Больше сахара для бытового, нет Борщ борщ = new Борщ().
  • макросы

По сравнению с python:

  • CAS
  • ООП с инкапсуляцией, ролями, отсутствием необходимости носить self с собой
  • Юникод на уровне графем.
  • Динамические переменные.
  • Подмножества.
  • Мультиметоды из коробки.
  • Ошибки времени компиляции о недоступных лексических данных из коробки (да, есть чекеры, есть реализации помимо cpython, но мы про ваниль сейчас, которая установлена практически везде)
  • Фазеры
  • react/whenever/supply
  • await без async
  • Кастомные операторы
  • Рациональные числа по умолчанию
  • Регулярки 2.0 в грамматики из коробки
  • шепотом: (многострочные лямбды)
  • макросы
  • (только не смейся сейчас) инкремент/декремент
  • given/when

Руби я не знаю настолько, чтобы сравнивать, лучше кому-то другому.

Чисто для справки: я могу написать такого же размера список недостатков Raku, так что не нужно сейчас мне рассказывать, что я фанатик потому что патаму. Есть плюсы и минусы, потому что оно всё разное.

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

computer vision базируется на сишных либах. Прикрутить можно, и даже запилить какой-то фреймворк вокруг тоже достижимо, но непонятно зачем. Ну то есть либы останутся теми же, и в сравнении с какой-нибудь там питонячьей SimpleCV мегавыхлопа не будет.

Есть нативный PDL, но это скорее заготовка, чем законченный продукт. Хотя в University of Washington его астрономам дают в рамках спецкурса по введению в программирование.

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

могу написать такого же размер список недостатков Raku

напиши, интересно посмотреть

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

По сравнению с python:

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

Юникод на уровне графем.
Динамические переменные.
Подмножества.

идем далее:

Фазеры

какая-то странная штука, насколько я понял это что-то типа методов цикла жизни класса, но для функций. не понял, зачем это, если можно сразу в виде класса и написать

react/whenever/supply

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

Кастомные операторы

возможность добавления своих новых $%^*&&^$ это огромное ЗЛО. да и зачем экономить секунду при печатании чтобы потом самому через пару лет пытаться понять что «person1 % person2» означает в коде. но ок, это вкусовщина

Рациональные числа по умолчанию

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

Регулярки 2.0 в грамматики из коробки

под «2.0» или улучшенными ты ведь подразумеваешь «из Raku»? странно ожидать их где-то еще, раз они были придуманы только что именно там. но тем не менее, в качестве либы всегда был pyparse с очень похожей идеей. популярность этой библиотеки по сравнению с самим питоном как бы намекает о востребованности подобного парсера прямом в самом языке

шепотом: (многострочные лямбды)
макросы
отсутствием необходимости носить self с собой

я наоборот явный self/cls всегда считал преимуществом в питоне и луа, но это вкусовщина, впринципе, и, к тому же:

Things that will Not Change in Python 3000 https://www.python.org/dev/peps/pep-3099/

и это примерно как логические блоки пробелами. хотя в том списке «никогда не» были и `:=`, а его-то добавили в 3.8 вопреки

(только не смейся сейчас) инкремент/декремент

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

given/when

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

actionless ★★★★★ ()

Листаю доки, а там тааакое:

class Task {
    has      &!callback;
    has Task @!dependencies;
    has Bool $.done;
 
    # Normally doesn't need to be written 
    method new(&callback, *@dependencies) {
        return self.bless(:&callback, :@dependencies);
    }
 
    # BUILD is the equivalent of a constructor in other languages 
    submethod BUILD(:&!callback, :@!dependencies) { }
 
    method add-dependency(Task $dependency) {
        push @!dependencies, $dependency;
    }
 
    method perform() {
        unless $!done {
            .perform() for @!dependencies;
            &!callback();
            $!done = True;
        }
    }
}
У меня детектор мусора зашкалил. Растошкольники нервно курят в коридоре. Нет, серьезно кому-то хочется сидеть вычитывать все эти :@&!?

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

не знаю, язык на основе JVM заточенный под оброботку текста и многопоточность

мне пока единственный юзкейс приходит на ум — сервер поисковой индексации

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

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

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

Для биг-дата сыромятины Raku практически идеален, но перепрыгнуть потенциальную яму устоявшихся привычек и наработок - это не хухры мухры. Во всяком случае мгновенно такие вещи не происходят.

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