Size: a a a

2021 March 03

RB

Roman Blog in rust_offtopic
вот как sizeof реализован на расте? Это просто функция, которая генерик. Которая генерируется и позже связывается
источник

RB

Roman Blog in rust_offtopic
но язык сам  о ней ничего не знает. Только кодогенератор, а там уже нет типов. Нет тайпчекинга. Нету языка
источник

RB

Roman Blog in rust_offtopic
Mikola Summer Duck
И что нам это даёт? Мы ведь всё равно не можем полагаться на характеристики конкретного типа если пишем женерик.
Можем. В этом и смысл.
источник

RB

Roman Blog in rust_offtopic
Это как раз то, о чём я говорил. Когда у используемой системы есть ограничения, то мозг начинает их воспринимать за что-то, что не можем. Ты хочешь мыслить в рамках возможного. И ты начинаешь мыслить, чтобы не придумывать то, что не реализуемо.

И подход С++, да и любого языка с полноценным полиморфизмом, как раз и заключается в интроспекции типов внутри полиморфного вызова и далее генерации на базе этой интроспекции чего-либо.

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

RB

Roman Blog in rust_offtopic
Поэтому, допустим, ты не сможешь реализовать банальное to_tuple. И все попытки это сделать обречены на провал. Вообще ты можешь подумать, почему любая попытка сделать что-то похожее на кресты и полиморфизм всегда вырождается в монорфизацию руками
источник

m

makoven in rust_offtopic
Roman Blog
Поэтому, допустим, ты не сможешь реализовать банальное to_tuple. И все попытки это сделать обречены на провал. Вообще ты можешь подумать, почему любая попытка сделать что-то похожее на кресты и полиморфизм всегда вырождается в монорфизацию руками
Уделал растоманов
источник

H

Hirrolot in rust_offtopic
makoven
Уделал растоманов
+
источник

MS

Mikola Summer Duck in rust_offtopic
Не ну туше́
источник

RB

Roman Blog in rust_offtopic
Полиморфизм рекурсивно порождает множество монорфизаций. Поэтому сколько я не просил людей написать мне что-то на расте, то это всегда сводится к закату солнца руками. Т.е. они пытаются руками сделать одну итерацию. Написать таблицу преобразований. Но это не работает так.

Допустим, возльмём то же to_tuple. У нас есть структура, есть магическое get и size. Количество полей и взять поле по индексу. Да, ты можешь написать 10 функций(ну пусть более 10 полей ненужно). Вот ты напишешь там 10 разных функций
источник

p

polunin.ai in rust_offtopic
нахуй ваш этот борроу чекер в общем. буду все оборачивать в целлы и рефцеллы.
источник

RB

Roman Blog in rust_offtopic
вроде работает, а потом мы захотим добавить флаг скипа поля. И вот тебе второй уровень полиморфизма. Ты опять либо не сможешь, либо будет реализовывать ещё версию для каждого поля с есть/нет
источник

RB

Roman Blog in rust_offtopic
и  вот чем дальше - тем больше. И таких слоёв могут быть сотни/тысячи. И их действительно столько в рядовом с++-коде.
источник

m

makoven in rust_offtopic
Roman Blog
и  вот чем дальше - тем больше. И таких слоёв могут быть сотни/тысячи. И их действительно столько в рядовом с++-коде.
Писать я на нем конечно не буду
источник

RB

Roman Blog in rust_offtopic
Mikola Summer Duck
Это какие? idris?
Ну, возможно. Но в основном С++. Идрис уже ближе, потому как он позволяет не терять типы. Но они всё равно теряются, но хотя бы логика возможна такая же, как и в случае с полиморфизмом реальном
источник

RB

Roman Blog in rust_offtopic
makoven
Писать я на нем конечно не буду
Ну очень часто адепты раста кричат про зерокост. Именно этим достигается зерокост в С++. А всякие фокусы уровня "посмотри как хорошо мой мусор свернул llvm"  - ничего не значат. Подобным свойством обладает что угодно прикрученное к llvm.

Допустим, я приводил пример с итераторами
источник

RB

Roman Blog in rust_offtopic
вот в C++ vec | map(_ * 2)- RA,  vec | map(_ * 2) | filter(_ < 123) - последовательный доступ. В расте же и то и то последовательный
источник

RB

Roman Blog in rust_offtopic
именно потому, что итераторы не полиморфны
источник

RB

Roman Blog in rust_offtopic
у тебя есть разные типы итераторов, но все они выражаются через один интерфейс, максимально общий - это последовательный доступ
источник

RB

Roman Blog in rust_offtopic
поэтому обобщённый код теряет свойства итератора, потому как из интерфейса ты не достанешь оригинальный тип
источник

RB

Roman Blog in rust_offtopic
поэтому в С++ в первом случае можно вызвать `(vec | map(_ * 2))[123]` а во втором нет. Потому как свойства не затираются
источник