Size: a a a

2020 August 03

KR

Kai Ren in rust_offtopic
Переслано от Roman na
да. Ключ концепции в том, что мы оборачивает полиморфный код в полиморфный код. А момент вызова он будет весь инстанцирован, типизирован и протайпчекан. И что самое важное - для каждого вызова инстанцирование будет уникальным. Таким образом мы можем иметь такую же уникальную логику для каждого типа
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
map(tuple{int, float), [](auto x) { return x; }); - будет два вызова
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
и первый вызов будет с типом int, а второй с float
источник

KR

Kai Ren in rust_offtopic
Переслано от Kai Ren
Да, спасибо. Я в дизайне языков не силён, но плюсовые шаблоны кажутся интересной и недоизученной темой, которой бы больше внимания.
А то всяких хинди-мильнеров уже взад и в поперек раскатали и проработали. А тут достаточно интересные свойства.
Ты не против, если я форвардну это в чат раст_оффтопика? Думаю и другим будет почитать интересно.
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
Ну это не свойство шаблонов - это свойство полиморфизма статического. Шаблоны просто его реализуют. Интересно тут то, что запарта почему-то окрестила это неправильный полиморфизмом
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
хотя никак иначе его не реализовать. И назвала ненастоящий полиморфизм полиморфизмом
источник

KR

Kai Ren in rust_offtopic
Переслано от Kai Ren
Там были какие-то трейд-оффы с тайпчеком, и я на вскидку не вспомню какие именно.

Ты под статическим полиморфизмом подразумеваешь именно мономорфизацию до тайпчека, так?

А в чем суть нестатичности мономорфизации общепринятых генериков? Только в том, что типы стираются, или ещё есть моменты?
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
Ну семантически монорфизация вообще не происходит. К тому тайпчекинг в шаблонах происходит. Он происходит только для тех частей, которые не зависят от шаблонов. А те, которые зависят - протайпчекать невозможно. Мы же не знаем типов.
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
общепринятые генерики не полиморфны. Это по-сути тоже самое, что написать f(base x)
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
мы можем туда передать любого наследника и это будет считать полиморфизмом. По запарте
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
и проблемы те же.
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
её задача свести полиморфный код к мономорфному. Одна и единственная. А далее диспатч сделать в рантайме через vtable
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
в С++ шаблоны взяли потому, что подобная реализация единственная, которая позволяет получить полиморфизм
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
допустим, мы хотим принять int - значит функция должна быть сгенерена под int. Мы не можем передать int в мономорфную функцию
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
и в этом проблема скриптухи, это причина почему в той же жаве в генерик value type не засунешь
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
и это одна из основных причин, почему скриптухи нужен gc
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
и эта та причина почему тот же раст стал быстрее скриптухи
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
никакие борроучекеры не спасут от условного void * в маня-полиморфных функциях
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
поэтому в расте и прикручены под языком "шаблоны", которые позволяют принять в функцию value-type
источник

KR

Kai Ren in rust_offtopic
Переслано от Roman na
здесь нет какого-то выбора. В статическом языке полиморфизм может быть только "на шаблонах"
источник