Size: a a a

2020 August 14

CD

Constantine Drozdov in rust_offtopic
понятно что подсядем на двойные диспетчера
источник

AZ

Alex Zhukovsky in rust_offtopic
Constantine Drozdov
не надо в смысле совершенно точно все узлы выписали?
да
источник

AZ

Alex Zhukovsky in rust_offtopic
экспрешн проблем же
источник

AZ

Alex Zhukovsky in rust_offtopic
ты решаешь что у тебя чаще меняется и все
источник

CD

Constantine Drozdov in rust_offtopic
ну такое, и какого списка достаточно
источник

AZ

Alex Zhukovsky in rust_offtopic
Constantine Drozdov
ну такое, и какого списка достаточно
ну вот иерархия по ссылке не менялась последние лет 10
источник

AZ

Alex Zhukovsky in rust_offtopic
кмк вполне стабильно для энума
источник

CD

Constantine Drozdov in rust_offtopic
Alex Zhukovsky
нет, это закрытая конструкция которую не надо пополнять.

Когда пишут её в открытую получаются такие уродцы https://docs.microsoft.com/en-us/dotnet/api/system.linq.expressions.expressionvisitor?view=netcore-3.1#methods
ну да, типичный двойной диспетчер в рантайме
источник

CD

Constantine Drozdov in rust_offtopic
Alex Zhukovsky
ну вот иерархия по ссылке не менялась последние лет 10
а там дело немного не в этом
источник

AZ

Alex Zhukovsky in rust_offtopic
ну вот вопрос зачем делать визитор который эмулирует энумы если можно их взять честные и получиь то же самое
источник

AZ

Alex Zhukovsky in rust_offtopic
Constantine Drozdov
ну да, типичный двойной диспетчер в рантайме
ты про экспрешн проблем слышал?
источник

CD

Constantine Drozdov in rust_offtopic
Alex Zhukovsky
ты про экспрешн проблем слышал?
смотри, в чём беда
источник

CD

Constantine Drozdov in rust_offtopic
вот ты написал енум Expr
источник

CD

Constantine Drozdov in rust_offtopic
заметь, что все бинарные операции в нём - коммутативные
источник

CD

Constantine Drozdov in rust_offtopic
теперь кто угодно написал visitor который работает только в коммутативном случае
источник

CD

Constantine Drozdov in rust_offtopic
даже если твой язык детектировал проблему при его расширении, он оказывается в ситуации "split", когда одна изначальная сущность Expr должна быть разбита на две - Expr и CommutativeExpr
источник

CD

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

CD

Constantine Drozdov in rust_offtopic
почему это произошло? потому что enum описывает контракт как "одно из", а не как "множество допустимых операций"
допустима любая операция, применимая ко всем элементам enum
источник

AZ

Alex Zhukovsky in rust_offtopic
да нет, просто делаешь Expr в Expr TCommutative и дальше сгатами как я показывал

Add : Expr<True>
Div : Expr<False>

и фиксиь ошибки компиляции
источник

AZ

Alex Zhukovsky in rust_offtopic
Constantine Drozdov
почему это произошло? потому что enum описывает контракт как "одно из", а не как "множество допустимых операций"
допустима любая операция, применимая ко всем элементам enum
у тебя есть контракт экспрешна и контракт тех кто его обрабатывает. Если ты сильно поменял семантику то их НАДО ломать
источник