Αλεχ
let foo = Foo {} - тут ваще никакого лайфтайма нет
Αλεχ
ни статик, ни не статик
Αλεχ
а когда мы делаем let bar = &foo то сразу появляется
Αλεχ
локальный
Cuno
что такое овнед-объект?
https://play.rust-lang.org/?gist=7ef4b5ca5dbe4ccd81070dc92303ab2e&version=stable&mode=debug&edition=2015
Vladimir
Cuno
Возвращаясь к изначальной проблема трейта Error. Допустим у объекта, который за этим трейтом скрывается есть некоторое заимствование. Как при downcast'е мы должны время жизни "угадать"?
саша
Vladimir
@Psilon я добрался до клавиатуры.
Смотри, тот лайфтайм, который ты говоришь никакого отношения к трейтам не имеет.
В руст есть trait bound и lifetime bound. Если первое определяет интерфейс который тип использует, то второе более внутреняя херня и служит доказательством что некий тип живет определенный лайфтайм.
Ключевое время жизни 'static означает что тип может жить столько сколько нужно, и не опирается на внешние сущности.
(ВЖ по большому счету не важно заимствование это или нет)
Vladimir
@Psilon https://play.rust-lang.org/?gist=9dad0ae0f6206b2a4c2795c149c691b4&version=stable&mode=debug&edition=2015
-__-
Vladimir
залил бы ты на playgen
Vladimir
если переполняется стек. Меняй рекурсию на цикл, в чем проблема?)
-__-
Alexander
Cuno
Alexander
Vladimir
что есть CPS
Cuno
В расте если что замыкания анбоксед по дефолту.
Vladimir
берешь вектор делаешь, вот и твой стек на хипе
Vladimir
пушишь что надо, попишь когда надо
Vladimir
let mut stack: Vec<(arg1, arg2,...) = ..;
Cuno
-__-
Thanks. Попробую.
По поводу времени сложно что-то сказать, у меня нету Хаскеля, чтобы сравнивать. Но я заметил, что на Расте eval(klmn(7, 6, 6, 7)) у меня считается 0.7с, а to_string() от него — 40с :D
Vladimir
Vladimir
будет на стеке
Vladimir
ведь эти замыкания нужно будет вызывать
Alexander
Это, возможно, кого-то удивит, но не всякую рекурсивную функцию можно преобразовать в цикл. 😉
Vladimir
лежать то они будут на куче, но их аргументы все равно стек займут
Vladimir
Alexander
удивит
Попробуйте фанкцию Аккермана преобразовать в цикл. 😉
Alexander
И добро пожаловать в теорию вычислимости! 😃
Vladimir
Vladimir
сорян
Vladimir
Vladimir
мне просто интересно
-__-
Там они конечно только с третьего раза справились. Но принцип понятен.
𝙽𝚒𝚌𝚔
Alexander
Vladimir
-__-
Но рекурсии же нет. То, что функция Аккермана не примитивно рекурсивна, не значит, что ее нельзя итеративно вычислить. Это значит, грубо говоря, что для вычисления не достаточно for, а нужен while.
Alexander
Но рекурсии же нет. То, что функция Аккермана не примитивно рекурсивна, не значит, что ее нельзя итеративно вычислить. Это значит, грубо говоря, что для вычисления не достаточно for, а нужен while.
"Цикл" в данном контексте подразумевает "в константной памяти", извините, что сразу этого не пояснил.
Хвост-рекурсивные функции можно вычислить в константной памяти, компилятор ли делает TCE, или программист руками переписывает в цикл - не принципиально.
Более сложную рекурсию в константной памяти вычислить не получится никак. Я могу свою функцию переписать без рекурсивных вызовов в CPS, но данные начнут накапливаться в куче вместо стека - вот и вся разница.
С функцией Аккермана та же фигня, так что прорыва в CS мы пока не произвели. 😊
Alexander
Cuno
Vladimir
пиздец, цикл уже не итерации, тогда что?
Vladimir
у тебя проблема в том, что размер стека фиксированный, тебе предложили сделать чтоб стек был динамического размера разместить в куче
Alexander
𝙽𝚒𝚌𝚔
Я даже дополню: есть такой класс сложности PSPACE, семейство алгоритмов, которые вычисляются используя только полиномиальный размер памяти (не меньше). Имеется также класс задач, для которых не известнох алгоритма, "более лёгкого" чем с полиномиальной памятью (PSPACE-complete). И таких задач множество. Например, поиск решения в игре Sokoban - это PSPACE-полная задача. Вы же знаете сокобан? ;-)
Αλεχ
Αλεχ
для меня static всегда была статическая переменная, то есть которая живет до конца программы
Αλεχ
и очевидно дропать статику нельзя
Αλεχ
либо кейворд неудачно придумали
Αλεχ
либо переиспользовали криво существующий
պլհկ
Ты путаешь static и 'static
Vladimir
Да не имеет он два толкования, просто толкование лайфтайма никак не связано с понятием переменной.
Илья
У кого нибудь есть под рукой примеры связи electron + rust?
red75prime
Точнее. Если T: 'static и a: T, то можно сделать let r: &'static T = &a;, пока r в области видимости a дропнуть нельзя.
red75prime
или для NLL: пока r существует
Vladimir
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