Αλεχ
let foo = Foo {} - тут ваще никакого лайфтайма нет
Αλεχ
ни статик, ни не статик
Αλεχ
а когда мы делаем let bar = &foo то сразу появляется
Αλεχ
локальный
Cuno
что такое овнед-объект?
https://play.rust-lang.org/?gist=7ef4b5ca5dbe4ccd81070dc92303ab2e&version=stable&mode=debug&edition=2015
Cuno
Возвращаясь к изначальной проблема трейта Error. Допустим у объекта, который за этим трейтом скрывается есть некоторое заимствование. Как при downcast'е мы должны время жизни "угадать"?
саша
Так и работает impl Trait. Тип известен компилятору, просто для юзера это нечто реализующее трейт
То, что компилятор знает тип - не значит, что пользователь для которого работают все законы монады должен знать тип.
саша
Они возвращают конкретный флет мап, просто потому что писались когда не было импл трейтов
Нет. Их не станут переделывать так, чтобы они возвращали экзистенциальный тип, особенно учитывая то, что в будущем не будет проблемы, чтобы кастануть определённый тип к экзистенциальному. По идее это вообще неявно должно делаться: let it: impl Iterator<u8> = [1, 2, 3, 4].into_iter();
Vladimir
@Psilon я добрался до клавиатуры. Смотри, тот лайфтайм, который ты говоришь никакого отношения к трейтам не имеет. В руст есть trait bound и lifetime bound. Если первое определяет интерфейс который тип использует, то второе более внутреняя херня и служит доказательством что некий тип живет определенный лайфтайм. Ключевое время жизни 'static означает что тип может жить столько сколько нужно, и не опирается на внешние сущности. (ВЖ по большому счету не важно заимствование это или нет)
Vladimir
@Psilon https://play.rust-lang.org/?gist=9dad0ae0f6206b2a4c2795c149c691b4&version=stable&mode=debug&edition=2015
-__-
В смысле "компилируется и запускается" - помогло. В смысле "не переполняет стек и обгоняет Haskell" - нет. 😃
Ты же заметил, что переполняется main, а не вспомогательный тред? Если не делать return, то все ок.
Alexander
Ты же заметил, что переполняется main, а не вспомогательный тред? Если не делать return, то все ок.
На бОльших термах переполняется вспомогательный. 😊 А где не делать return чтобы main не переполнялся?
Vladimir
залил бы ты на playgen
Vladimir
если переполняется стек. Меняй рекурсию на цикл, в чем проблема?)
Alexander
если переполняется стек. Меняй рекурсию на цикл, в чем проблема?)
В том, что хвостовую уже поменял, но это слабо помогло. 😊 Чтобы нехвостовую поменять нужно CPS делать, а это - создание башни замыканий. Что кажется немного сомнительным в Rust. Я неправ?
Alexander
Что есть "башня замыканий"?
А по CPS вопросов нет? 😉
Vladimir
что есть CPS
Cuno
А по CPS вопросов нет? 😉
Нет, потому что я скорее всего не пойму.
Cuno
В расте если что замыкания анбоксед по дефолту.
Vladimir
берешь вектор делаешь, вот и твой стек на хипе
Vladimir
пушишь что надо, попишь когда надо
Alexander
В расте если что замыкания анбоксед по дефолту.
Вот мне понадобятся Boxed. При этом замыкание внутри замыкания внутри замыкани ... и так хреналион раз. 😃
Vladimir
let mut stack: Vec<(arg1, arg2,...) = ..;
Alexander
что есть CPS
Continuation Passing Style.
-__-
Thanks. Попробую.
По поводу времени сложно что-то сказать, у меня нету Хаскеля, чтобы сравнивать. Но я заметил, что на Расте eval(klmn(7, 6, 6, 7)) у меня считается 0.7с, а to_string() от него — 40с :D
Alexander
это будет такая же рекурсия, не?
Но в куче, а не на стеке, поэтому чтек не переполнится. 😊
Vladimir
будет на стеке
Vladimir
ведь эти замыкания нужно будет вызывать
Alexander
Это, возможно, кого-то удивит, но не всякую рекурсивную функцию можно преобразовать в цикл. 😉
Vladimir
лежать то они будут на куче, но их аргументы все равно стек займут
Alexander
удивит
Попробуйте фанкцию Аккермана преобразовать в цикл. 😉
Alexander
И добро пожаловать в теорию вычислимости! 😃
Vladimir
сорян
Alexander
Я не шарю в ваших хаскелях
При чём тут Haskell? Вы хотели сказать "не шарю в Computer Science"?
Alexander
По поводу времени сложно что-то сказать, у меня нету Хаскеля, чтобы сравнивать. Но я заметил, что на Расте eval(klmn(7, 6, 6, 7)) у меня считается 0.7с, а to_string() от него — 40с :D
Rust: klmn 7 6 6 7 Done! real 0m0.552s user 0m0.432s sys 0m0.112s Haskell: klmn 6 7 7 6 $ time .stack-work/install/x86_64-linux/lts-12.0/8.4.3/bin/extended +RTS -N1 -M5G -A6M -H3G Done. real 0m0.348s user 0m0.264s sys 0m0.084s
Vladimir
Vladimir
мне просто интересно
-__-
Попробуйте фанкцию Аккермана преобразовать в цикл. 😉
https://stackoverflow.com/questions/10742322/how-to-rewrite-ackermann-function-in-non-recursive-style where is your god now? :)
-__-
Там они конечно только с третьего раза справились. Но принцип понятен.
Alexander
https://stackoverflow.com/questions/10742322/how-to-rewrite-ackermann-function-in-non-recursive-style where is your god now? :)
My god is still there. С явным стеком вместо неявного - это не откровение. 😊
Vladimir
My god is still there. С явным стеком вместо неявного - это не откровение. 😊
так никто тебе не говорит что не делай явный стек
-__-
Но рекурсии же нет. То, что функция Аккермана не примитивно рекурсивна, не значит, что ее нельзя итеративно вычислить. Это значит, грубо говоря, что для вычисления не достаточно for, а нужен while.
Alexander
Но рекурсии же нет. То, что функция Аккермана не примитивно рекурсивна, не значит, что ее нельзя итеративно вычислить. Это значит, грубо говоря, что для вычисления не достаточно for, а нужен while.
"Цикл" в данном контексте подразумевает "в константной памяти", извините, что сразу этого не пояснил. Хвост-рекурсивные функции можно вычислить в константной памяти, компилятор ли делает TCE, или программист руками переписывает в цикл - не принципиально. Более сложную рекурсию в константной памяти вычислить не получится никак. Я могу свою функцию переписать без рекурсивных вызовов в CPS, но данные начнут накапливаться в куче вместо стека - вот и вся разница. С функцией Аккермана та же фигня, так что прорыва в CS мы пока не произвели. 😊
Alexander
Но рекурсии же нет. То, что функция Аккермана не примитивно рекурсивна, не значит, что ее нельзя итеративно вычислить. Это значит, грубо говоря, что для вычисления не достаточно for, а нужен while.
Не уверен, что Вы подразумеваете под "итеративно вычислить", но по-моему использование явного стека прозрачно намекает на то, что итеративно вычислить нельзя. 😉
Alexander
Но там же... цикл... итерируется...
Тут нужна картинка с превращением самоуверенного студента в алкоголика. 😂
Vladimir
пиздец, цикл уже не итерации, тогда что?
Vladimir
у тебя проблема в том, что размер стека фиксированный, тебе предложили сделать чтоб стек был динамического размера разместить в куче
Alexander
пиздец, цикл уже не итерации, тогда что?
Цикл - просто синтаксическая конструкция. 😂
𝙽𝚒𝚌𝚔
Я даже дополню: есть такой класс сложности PSPACE, семейство алгоритмов, которые вычисляются используя только полиномиальный размер памяти (не меньше). Имеется также класс задач, для которых не известнох алгоритма, "более лёгкого" чем с полиномиальной памятью (PSPACE-complete). И таких задач множество. Например, поиск решения в игре Sokoban - это PSPACE-полная задача. Вы же знаете сокобан? ;-)
Αλεχ
для меня static всегда была статическая переменная, то есть которая живет до конца программы
Αλεχ
и очевидно дропать статику нельзя
Αλεχ
либо кейворд неудачно придумали
Αλεχ
либо переиспользовали криво существующий
պլհկ
Ты путаешь static и 'static
Vladimir
Да не имеет он два толкования, просто толкование лайфтайма никак не связано с понятием переменной.
red75prime
для меня static всегда была статическая переменная, то есть которая живет до конца программы
Если T: 'static, то можно взять ссылку &'static T, пока ссылка жива T дропнуть не получится. В основном всё.
Илья
У кого нибудь есть под рукой примеры связи electron + rust?
red75prime
Точнее. Если T: 'static и a: T, то можно сделать let r: &'static T = &a;, пока r в области видимости a дропнуть нельзя.
red75prime
или для NLL: пока r существует
Vladimir
Точнее. Если T: 'static и a: T, то можно сделать let r: &'static T = &a;, пока r в области видимости a дропнуть нельзя.
Эмм, нет, ссылку с статик лайфтаймом можно получить только с static переменных.
Vladimir
https://play.rust-lang.org/?gist=311ab14a1b46d7b9d140c53398aabf8c&version=stable&mode=debug&edition=2015
red75prime
да, что-то я протупил
Vladimir
>пока r в области видимости a дропнуть нельзя. тут как раз таки обратная логика, пока что-то бороуит другой обьект. Другой объект не может быть дропнут (читай перемещен).
red75prime
На самом деле время жизни ссылки на переменную типа T не может превосходить ни время жизни типа T, ни время жизни переменной типа T.
Αλεχ
чет я окончательно перестал понимать
Cuno
red75prime запутывает. Нет такого понятия как "время жизни типа" же.
Berkus