У нас есть Rust, поэтому C++ больше не нужен.

Oct 19, 2017 17:47


Просто чудесный пост у thesz, наглядно демонстрирующий мой лозунг из сабжа.

Давайте пройдёмся по пунктам:
> Большое неудобство, однако, составляет отсутствие подсказок компилятора в сообщении об ошибке

Rust прекрасно всё подсказывает, вплоть до того, что явно указывает как именно тебе надо исправить код, чтобы всё заработало.
> но сама необходимость ( Read more... )

programming, code, rust, c++

Leave a comment

thesz October 19 2017, 15:06:44 UTC
>А в Rust отсутствует возможность "неправильно" создать объект.

В Rust объект - это значение, или изменяемый кусок памяти? Если последнее, то увы.

>Ведь его же создавали люди, которые много программировали на C++ :)

Его создавали люди, которые мало программировали на Хаскеле, иначе бы его не было.

Надо мне собраться с силами. :(

Reply

thesz October 19 2017, 16:16:57 UTC
data ASTWST = A AST ST

emptyASTWST :: ASTWST
emptyASTWST = A (error "no AST") (error "no ST")

setAST :: ASTWST -> AST -> ASTWST
setAST (A _ _) ast = A ast (error "no ST")

setST :: ASTWST -> ST -> ASTWST
setST (A ast _) st = A ast st

computeASTST :: ASTWST -> ASTWST
computeASTST a@(A ast _) = setST a (computeSTFromAST ast)

computeASTWST :: AST -> ASTWST
computeASTWST ast = computeASTST $ setAST emptyASTWST ast

Здесь error используется для 1) уменьшения нагрузки на меня, любимого (тесты покажут) и 2) упрощения проектирования.

Значения лучше объектов.

Reply

swizard October 19 2017, 17:03:35 UTC
Ну я про это и говорю - то ли пример у тебя неудачный, то ли ты сам себя передумал.

Исходная постановка звучала так: "Моя проблема в C++ как раз в согласованности инициализации. Типа, программу разобрал, но таблицу символов не положил.".

Это делается просто возвратом из инициализатора заполненной структуры с двумя полями (AST и ST) - на компиляции гарантируется, что они были проинициализированы (а вот в С++ не гарантируется). "Забыть" положить что-то невозможно.

Но я понял, какую конкретно фичу ты хочешь продемонстрировать. Если что, то в Rust можно вот ровно то же самое написать, что у тебя в сниппете выше (если хочешь, я тебе приведу код, но ты же его всё равно читать не будешь). Просто в Rust это ни за чем не надо, делается по-другому и проще.

Reply

thesz October 20 2017, 09:56:28 UTC
Исчо рас.

Изменение ранее созданных данных это неявный канал обмена информацией.

Вдумайся, чтобы понять.

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

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

Reply

swizard October 21 2017, 00:24:23 UTC
Вдумался, всё равно не понял. Нет, Rust не позволяет менять ранее созданные данные, и да, это ограничено типами.

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

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

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

Reply

thesz October 21 2017, 06:58:36 UTC
Ну, тогда я подожду ещё лет десять, пока ты достаточно опыта получишь.

Reply

swizard October 21 2017, 10:38:33 UTC
Да куда уж мне =)

Reply

thesz October 21 2017, 10:53:28 UTC
Ты прав в своих сомнениях. Все-таки, Хаскель я выбрал в качестве языка для моей разработки в 1998 году, когда мне было 27 лет. После пересмотра моих типичных ошибок в моей типичной исследовательской деятельности.

А тебе уже больше 30.

С другой стороны, интересный опыт и новое понимание меня настигали и вот тут недавно, в районе 45 лет.

Так что, не отчаивайся.

Reply

swizard October 21 2017, 14:46:19 UTC
> А тебе уже больше 30.

Да блин, тридцать пять уже скоро, даже не напоминай :(

Слушай, кстати, а правду пишут, что после 35 в мозгу начинается интенсивная гибель нейронов, и, вообще, человек становится консервативным и перестаёт воспринимать всё новое?

Reply

thesz October 21 2017, 20:00:33 UTC
Это чуть раньше начинается, лет в 30.

И это правда.

У нас организм умеет вырабатывать нейротрофический фактор мозга, который увеличивает ветвистость старых нейронов и растит новые. Он вырабатывается в ответ на три стресса - долго идти (нагрузка на выносливость), быстро бежать (нагрузка на силу) и голод. Для ходьбы доказано, что она растит мозг (и бег, и велик, и плавание). Сила имеет немного другое действие. Как и голод - сила и голод улучшают гормональный баланс и улучшают концентрацию внимания, стремление к новому и живость мышления.

Я до 42 лет очень много ходил, да и сейчас стараюсь тоже.

Очень рекомендую. ;)

Статью в википедии про нейротрофический фактор мозга прочитай. Там не все, но достаточно, чтобы изменить образ жизни. ;)

Reply

kika October 23 2017, 08:41:22 UTC
Нет, я только в 35 начал более-менее нормально программировать, в смысле понимать что я делаю и зачем, а не просто писать в день полтыщи строк компилирующегося кода.

Reply

thedeemon October 20 2017, 08:00:12 UTC
Этот пример не отличается от использования структуры в Си. Где тут использование типов во благо? Где хоть какие-то гарантии?

Reply

thesz October 20 2017, 09:57:18 UTC
Ссылки.

Пример отличается от Си наличием "значений", а не объектов.

Журнал, что ли, взломали?

Reply

thedeemon October 20 2017, 10:21:38 UTC
Если весь сыр-бор в иммутабельности, то насколько я понимаю в Расте с ней все нормально, туплы и структуры иммутабельные, пока явно не попросишь обратного.

Reply

thesz October 20 2017, 10:36:06 UTC
Я тут уже достаточно написал.

Похоже, журнал thedeemon таки взломали.

Reply

thesz October 19 2017, 15:32:33 UTC
Кстати, я думаю, что Rust вполне может быть реализован, как библиотека на Хаскеле. eDSL.

А вот наоборот - нет. ;)

Reply


Leave a comment

Up