Very weirdly organized, but it JITs!

This commit is contained in:
2023-03-24 10:28:32 -05:00
parent ff8412acca
commit 4aa3a9419a
14 changed files with 441 additions and 81 deletions

View File

@@ -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 {