Sherzod
у него рекурсия
Kerrigan
открой гитхаб
Sherzod
он спрашивает: что делать
Anonymous
и че
Sherzod
ему отвечают: увеличь лимит рекурсии
Anonymous
сложные функции с рекурсией в расте могут не работать
Sherzod
дальше нужно ОРАТЬ
Kerrigan
ну блин, либа которая может развалиться из-за того что у тебя лимит на рекурсию это как-то смешно
Kerrigan
и на расте
Oleg
Догадываюсь, что для рекурсии там генерятся циклы со статически определённым количеством итераций
Oleg
Но макро-парсеры - это тот ещё хардкор. Если дизайн похожий на parboiled 2
Oleg
Они, естественно супер-быстрые, но ппц какие негибгие
պլհկ
Из чего?
Oleg
Из "упростителей" проблемы с типами на полстраницы
պլհկ
Уже сейчас можно стирать через Box, но это не зерокост
Yaroslav
кстати, а hyper достаточно стабилен что бы писсать на нем свой бложег? (есть у меня такой пунктик, написать свой блог на http либе) ☺️
Oleg
Бокс, конечно, более универсальное решение
Oleg
Но вот я подумал про ту либу https://github.com/bluss/either
Oleg
Вот хорошо было бы, чтобы можно было делать бранчи, сравнительно с небольшим костом, но без бокса
Oleg
Т.е. как either, только автогенерящийся enum произвольной кратности и выводящий сам любой trait
Oleg
Нет таких RFC?
分解物質
примеры
Loyd
either не нужен
Oleg
ну представь ты пишешь себе такой код fn foo_iter() -> impl MyTrai{ some match { case1 => code1 case2 => code2 case3 => code 3 } }
Oleg
где code1 code2 code3 - разных типов
Oleg
очевидно, такой код не компилится
Loyd
лол
Что "лол"? Называйте нормально варианты енума
Loyd
А не мудацкие left-right
Oleg
нам нужно ручками писать enum
Loyd
Хуй потом проссышь что написано
Oleg
и зафигачивать туда нужные типы
Loyd
причем тут left/right
Притом, что either это left и right
Oleg
некоторые из которых, учитывая замыкания мы не можем даже записать
Loyd
ох блядь
https://hackage.haskell.org/package/base-4.9.1.0/docs/Data-Either.html
Loyd
матчасть учите
Loyd
Если вы под either алгтд понимаете ­ — это ваши проблемы
Sergey
в rust есть Result
Oleg
вместо этого мы можем написать что-то вроде fn foo_iter() -> impl MyTrait{ some match as MyTrait{ case1 => code1 case2 => code2 case3 => code 3 } }
Oleg
тоесть?
ну тип какой-нибудь Map<, >, где второй аргумент - лямбда
Loyd
где code1 code2 code3 - разных типов
Дык, зависит от того, что ты хочешь в итоге с этими code1 code2 code3
Loyd
в rust есть Result
Да, с Ok/Err, у которых понятное предназначение
Loyd
А не хуй пойми какие left и right
Oleg
вместо этого мы можем написать что-то вроде fn foo_iter() -> impl MyTrait{ some match as MyTrait{ case1 => code1 case2 => code2 case3 => code 3 } }
соответственно на такой код компилятор реагирует так он генерирует на лету новый enum с параметрами типов такими же, как он выловил из вышестоящего fn, делает у него три альтернативы с типами соотвествующими code1, code2, code3
Anonymous
и нахуй это
Oleg
fn foo_iter() -> MyEnum { match something{ case1 => E1(code1), case2 => E2(code2), case3 => E3(code3), } }
вот именно это, только E1, E2 и E3 за тебя компилятор напишет
Anonymous
если у тебя есть причина делать возвращение для нескольких типов
Loyd
Как дальше с этим работать предлагаешь?
Oleg
почему сразу такой код не написать?
ну хорошо у меня есть такой код case mode{ true => xs.map(| x| x * 2) false => xs.filter(|x| x > 10) } определите для него enum мне
Loyd
Если у тебя такие нужды, то динамический диспатчинг, имхо, в 99% случаях лучше.
Oleg
xs : Vec<uzise>
Oleg
теоретически
Anonymous
xs : Vec<uzise>
типа нет
Loyd
Зачем менять абстракцию на... на что?
Oleg
Зачем?
чтобы зеро кост, только стэк и т.пю
Anonymous
у тебя просто будет ошибка компиляции потому что у века нет таких методов