LINUX.ORG.RU

История изменений

Исправление 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)
}
Как я уже сказал, это абстрактный пример.