fix compilation issue
This commit is contained in:
parent
234ab7c7cb
commit
4acbd704e0
|
@ -160,44 +160,41 @@ impl Machine {
|
||||||
env: Vec<Value>,
|
env: Vec<Value>,
|
||||||
term: Term<NamedDeBruijn>,
|
term: Term<NamedDeBruijn>,
|
||||||
) -> Term<NamedDeBruijn> {
|
) -> Term<NamedDeBruijn> {
|
||||||
let mut lam_cnt = 0;
|
fn rec(
|
||||||
let mut term = term;
|
lam_cnt: usize,
|
||||||
|
t: Term<NamedDeBruijn>,
|
||||||
loop {
|
this: &mut Machine,
|
||||||
match term {
|
env: &[Value],
|
||||||
|
) -> Term<NamedDeBruijn> {
|
||||||
|
match t {
|
||||||
Term::Var(name) => {
|
Term::Var(name) => {
|
||||||
let index: usize = name.index.into();
|
let index: usize = name.index.into();
|
||||||
if lam_cnt >= index {
|
if lam_cnt >= index {
|
||||||
return Term::Var(name);
|
Term::Var(name)
|
||||||
} else {
|
} else {
|
||||||
return env
|
env.get::<usize>(env.len() - (index - lam_cnt))
|
||||||
.get::<usize>(index - lam_cnt)
|
|
||||||
.cloned()
|
.cloned()
|
||||||
.map_or(Term::Var(name), |v| self.discharge_value(v));
|
.map_or(Term::Var(name), |v| this.discharge_value(v))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Term::Lambda {
|
Term::Lambda {
|
||||||
parameter_name,
|
parameter_name,
|
||||||
body,
|
body,
|
||||||
} => {
|
} => Term::Lambda {
|
||||||
term = *body;
|
|
||||||
lam_cnt += 1;
|
|
||||||
|
|
||||||
return Term::Lambda {
|
|
||||||
parameter_name,
|
parameter_name,
|
||||||
body: Box::new(rec(lam_cnt + 1, *body, env, this)),
|
body: Box::new(rec(lam_cnt + 1, *body, this, env)),
|
||||||
};
|
},
|
||||||
}
|
|
||||||
Term::Apply { function, argument } => Term::Apply {
|
Term::Apply { function, argument } => Term::Apply {
|
||||||
function: Box::new(rec(lam_cnt, *function, env, this)),
|
function: Box::new(rec(lam_cnt, *function, this, env)),
|
||||||
argument: Box::new(rec(lam_cnt, *argument, env, this)),
|
argument: Box::new(rec(lam_cnt, *argument, this, env)),
|
||||||
},
|
},
|
||||||
|
|
||||||
Term::Delay(x) => Term::Delay(Box::new(rec(lam_cnt, *x, env, this))),
|
Term::Delay(x) => Term::Delay(Box::new(rec(lam_cnt, *x, this, env))),
|
||||||
Term::Force(x) => Term::Force(Box::new(rec(lam_cnt, *x, env, this))),
|
Term::Force(x) => Term::Force(Box::new(rec(lam_cnt, *x, this, env))),
|
||||||
rest => rest,
|
rest => rest,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
rec(0, term, self, &env)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn force_evaluate(
|
fn force_evaluate(
|
||||||
|
|
Loading…
Reference in New Issue