Pull to refresh
4
0
Артём Борисовский @burjui

Программист

Send message
Точно, спасибо за исправление.
Андрей Александреску обмолвился о generics в Go в одном из CppCast:
«It became the n-word of Go. Like you can't say 'generics' with 'Go', because everybody is gonna be offended in Go communitiy»

https://www.reddit.com/r/programming/comments/3qs888/cppcast_d_with_andrei_alexandrescu
Для тех, кто не знает, «n-word» — это эвфемизм слова «nigger» в США.
Знать-то знаю — в теории, но не умею. В данный момент я тренируюсь «на кошках»: пишу компилятор игрушечного функционального ЯП (пока в RISC-подобный байт-код). Пока реализовал только целые числа, строки, переменные, функции и одну ровно одну оптимизацию — свёртку и распространение констант (constant folding and propagation). Боюсь, с такими навыками от меня будет больше вреда, чем пользы. Пусть уж лучше пилят эксперты в этой области, а я пока подтяну свои знания математики (алгебры, для начала), ибо с нынешними разрабатывать компиляторы уж больно тяжко.
Вы приписываете мне свои домыслы:
Может, все-таки стоит разобраться, а не говорить «у меня не вышло написать как на <подставить язык>, rust явно поломан»?

Я такого не утверждал. Вот мои слова:
Инструмент не доделан

Смысл этого высказывания казался мне очевидным в контексте этой нити обсуждения, но, по-видимому, я ошибался. Я писал про компилятор, а не про язык. Это компилятор не может понять, что match Option<T> в ветке None не должен ничего занимать. Язык тут ни при чём, это ограничение компилятора. В этом RFC чётко написано, какие проблемы он решает, среди которых и лексические одалживания. Следовательно, разработчики согласны, что это — проблема, и что её можно решить введением нового временного представления кода (MIR) в компиляторе. Мне не важно какой у этого RFC приоритет, и какие есть способы сделать за компилятор его работу (data flow analysis). Меня никто не заставляет писать код на Rust, так что у меня есть куча времени, пока RFC не реализуют. Когда это сделают, я вернусь к изучению Rust и сэкономлю кучу времени как на изучении языка, так и на изучении библиотек, которые за это время, несомненно, улучшатся, а в исходниках некоторых ещё и не будет костылей, связанных с лексическими одалживаниями, что позволит мне почувствовать дух идиоматического Rust.

Надеюсь, на этот раз я достаточно ясно выразил свои мысли.
Мне кажется, это как-то стрёмно — пытаться выехать на том, что «не линчуешь негров». Такие вещи всегда подразумеваются по умолчанию. Это как хвалиться, что не справляешь большую нужду в общественных местах.
Ключевое слово — first.
Скромнее надо быть, а то так о себе напомнили, будто ваш проект очень важен. Хотел подколоть насчёт вечного альфа-статуса проекта, зашёл на reactos.org проверить, и вижу
такую картинку


The first Operating System controlled directly by its Community.
Раньше хоть скромно писали, что «возможно, будете определять будущее ОС».
Жить-то можно, но нужно ли? Я всего лишь хотел потестировать крутые фишки Rust вроде pattern matching, написав то, что уже неоднократно писал на C, C++ и D — парсер (и, возможно, компилятор) игрушечного ЯП. Везде вызов одного метода парсера из другого прекрасно работал, а тут компилятор Rust втирает мне какую-то дичь. Я два часа копался в документации, читал блоги и писал хеллоуворлды, пока не понял, что дурак в данном случае — компилятор, а не я. И после этого я должен посидеть ещё часок и придумать, как его обвести вокруг пальца (не вышло, кстати), при том, то я написал от силы 1/5 часть парсера.

Мне кажется, это просто не стоит потраченного времени, т.к. это проблема компилятора, а не моего кода. Инструмент не доделан, разработчики работают над этим — стало быть, мне незачем пытаться пробить стену головой, если эту стену скоро уберут. Тем более, изучение Rust — это моё хобби, а не работа.
Ответить на этот вопрос можно, только реализовав идею. Но всем, кто хочет написать на Rust что-нибудь достаточно объёмное, я предлагаю подождать починки borrow checker во избежание порчи впечатлений: github.com/rust-lang/rfcs/pull/1211
Всё-таки, это раздражает, когда компилятор в очевидных случаях не даёт вызвать один метод из другого или сделать match, мотивируя это «занятостью» ссылки. А всё из-за лексических lifetime.
Да ладно, каждый школьник же делает домашки по браузерным движкам и компиляторам в свободное от гуляния по ЦЕРНу время.
$ racket
Welcome to Racket v6.2.1.
> (λ (x) x + 1)
#<procedure>
Потому что #\u03BB
Если обнаружение дефектов — это нормальная ветка сценария, то исключения бросать нельзя. В алгоритме выше дело обстоит именно так, поэтому забудьте про исключения.
Точно, это меня переклинило, и я отчего-то решил, что find_defects() должен работать как check_defects(), а забыв о семантике слова find.

А принцип «явное лучше неявного» одинаково хорошо работает и в ООП, и в ФП, и совет про возвращение значения из функции вместо установки поля класса — как раз из этой серии.
В данном примере функциональщина ни при чём, это базовые принципы разработки ПО. Совершенно очевидно, что с оригинальным find_defects() пропустить ошибку настолько просто, насколько это вообще возможно — для этого даже не нужно писать код. Лучше использовать исключения. И «совсем правильный вариант» мне тоже не нравится, т.к. нужно озаботиться получением экземпляров successManager и failManager (ну и названия!) и не забыть подписаться на соответствующие события — и это только для find_defects().
Отлична книга, как раз перечитываю. Мне нравится логичный и структурированный подход Дядюшки Боба к созданию ПО. В отличие от большинства из нас, он смог после хождения по граблям сделать выводы и придумать, как уменьшить вероятности наступить на грабли в дальнейшем, не нарушая чистоты кода. Большим плюсом книги является также тот факт, что многие примеры плохого и хорошего кода взяты из реальных проектов (в основном, из FitNesse).
А так же над проработкой консистентных API (как определить, подключена ли любая гарнитура?) и чистотой кода платформы (например, FragmentManager). Мне кажется, Error1024 правильно угадал приоритеты.
а они там до 42-арных

А вдруг не хватит?
Дополняю: totallylazy. Библиотека для работы с ленивыми структурами данных, в частности с последовательностями (map, filter, fold/reduce...), есть Option, Either и т.д.
Пример кода генерации тестовых данных для ListAdapter на Android:

final Iterable<ListItem> itemSource =
    iterate(increment, 1)
    .map(i -> (ListItem) new TestListItem()
            .withTitle(format("item %s", i))
            .withTags("item", valueOf(i), "test")
            .withSectionHeader(random.nextBoolean() ? some(format("section %s", i)) : none()))
    .take(20)
    .toList();
Кстати, о лени: totallylazy. Имеются Sequence + генераторы, Option, а также filter, map/flatMap, fold/reduce и ещё кучка сверху. Без этой библиотеки и Retrolambda я бы уже повесился.
Спасибо. А на скорости сборки сильно отразилось?

Information

Rating
Does not participate
Location
Калининград (Кенигсберг), Калининградская обл., Россия
Date of birth
Registered
Activity