diff options
Diffstat (limited to 'src/semantic/translate.rs')
-rw-r--r-- | src/semantic/translate.rs | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/semantic/translate.rs b/src/semantic/translate.rs index 08e600f..4d51e60 100644 --- a/src/semantic/translate.rs +++ b/src/semantic/translate.rs @@ -38,10 +38,10 @@ impl<F: frame::Frame> Translate<F> { } } - pub fn make_level( + pub fn make_level<I: Iterator<Item=frame::Escape>>( &mut self, parent: LevelRef<F>, - formals: Vec<frame::Escape>) -> LevelRef<F> { + formals: I) -> LevelRef<F> { let id = self.level_counter; self.level_counter += 1; Rc::new(RefCell::new(Level::Level { @@ -78,4 +78,28 @@ impl<F: frame::Frame> Translate<F> { } } } + + pub fn call<I: Iterator<Item=Expression>>(&mut self, target: Expression, parameters: I) -> Expression { + Expression::Exp(ir::Expression::Call( + Box::new(match target { + Expression::Exp(e) => e, + Expression::Void(_) => panic!("Can't call Void expression"), + }), parameters.into_iter().map(|p| match p { + Expression::Exp(e) => e, + Expression::Void(_) => panic!("Can't evaluate Void expression"), + }).collect())) + } +} + +impl<F: frame::Frame> Level<F> { + pub fn to_exp(&self) -> Expression { + match self { + &Level::Top => { + panic!("Function defined in top level frame") + } + &Level::Level { ref frame, .. } => { + Expression::Exp(frame.to_exp()) + } + } + } } |