Very weirdly organized, but it JITs!
This commit is contained in:
@@ -6,16 +6,7 @@ impl Program {
|
||||
let mut gensym_index = 1;
|
||||
|
||||
for stmt in self.statements.drain(..) {
|
||||
match stmt {
|
||||
Statement::Print(_, _) => new_statements.push(stmt),
|
||||
Statement::Binding(_, _, Expression::Reference(_, _)) => new_statements.push(stmt),
|
||||
Statement::Binding(_, _, Expression::Value(_, _)) => new_statements.push(stmt),
|
||||
Statement::Binding(loc, name, value) => {
|
||||
let (mut prereqs, new_value) = value.rebind(&name, &mut gensym_index);
|
||||
new_statements.append(&mut prereqs);
|
||||
new_statements.push(Statement::Binding(loc, name, new_value))
|
||||
}
|
||||
}
|
||||
new_statements.append(&mut stmt.simplify(&mut gensym_index));
|
||||
}
|
||||
|
||||
self.statements = new_statements;
|
||||
@@ -23,6 +14,25 @@ impl Program {
|
||||
}
|
||||
}
|
||||
|
||||
impl Statement {
|
||||
pub fn simplify(self, gensym_index: &mut usize) -> Vec<Statement> {
|
||||
let mut new_statements = vec![];
|
||||
|
||||
match self {
|
||||
Statement::Print(_, _) => new_statements.push(self),
|
||||
Statement::Binding(_, _, Expression::Reference(_, _)) => new_statements.push(self),
|
||||
Statement::Binding(_, _, Expression::Value(_, _)) => new_statements.push(self),
|
||||
Statement::Binding(loc, name, value) => {
|
||||
let (mut prereqs, new_value) = value.rebind(&name, gensym_index);
|
||||
new_statements.append(&mut prereqs);
|
||||
new_statements.push(Statement::Binding(loc, name, new_value))
|
||||
}
|
||||
}
|
||||
|
||||
new_statements
|
||||
}
|
||||
}
|
||||
|
||||
impl Expression {
|
||||
fn rebind(self, base_name: &str, gensym_index: &mut usize) -> (Vec<Statement>, Expression) {
|
||||
match self {
|
||||
|
||||
Reference in New Issue
Block a user