История изменений
Исправление Aswed, (текущая версия) :
Например так
fn gen_fibs() -> USeq {
fn rec(a : usize, b : usize) -> USeq {
InfLazyList{head : a, tail : lazy!(rec(b, a+b))}
}
rec(1, 1)
}
Ну и lazy собсна в довесок
struct Lazy<T> {
val : LazyVal<T>
}
enum LazyVal<T> {
Forced(Box<T>),
NotForced(Box<Fn()->T>),
Nil
}
macro_rules! lazy {
($expr:expr) => {
Lazy {
val : LazyVal::NotForced(Box::new(move||$expr)),
}
}
}
impl<T> Lazy<T> {
fn force(&mut self) -> &mut T {
match self.val {
LazyVal::Forced(ref mut val) => return val,
_ => ()
}
match mem::replace(&mut self.val, LazyVal::Nil) {
LazyVal::NotForced(fnc) => {
self.val = LazyVal::Forced(Box::new(fnc()));
match self.val {
LazyVal::Forced(ref mut val) => return val,
_ => panic!()
}
},
_ => panic!()
}
}
}
Исходная версия Aswed, :
Например так
fn gen_fibs() -> USeq {
fn rec(a : usize, b : usize) -> USeq {
InfLazyList{head : a, tail : lazy!(rec(b, a+b))}
}
rec(1, 1)
}