From ebcea685f311b2ce8e81e5723f03d8bf760f9d47 Mon Sep 17 00:00:00 2001 From: greg Date: Tue, 12 Jun 2018 19:37:53 -0700 Subject: [PATCH] Fix looking up functions --- schala-lang/src/eval.rs | 37 ++++++++++++++++++---------------- schala-lang/src/reduced_ast.rs | 6 ++---- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/schala-lang/src/eval.rs b/schala-lang/src/eval.rs index c1fe7ed..ca6c270 100644 --- a/schala-lang/src/eval.rs +++ b/schala-lang/src/eval.rs @@ -144,13 +144,10 @@ impl<'a> State<'a> { match expr { literal @ Lit(_) => Ok(literal), Call { box f, args } => { - if let Val(name) = f { - self.apply_data_constructor(name, args) - } else { - match self.expression(f)? { - Func(f) => self.apply_function(f, args), - other => return Err(format!("Tried to call {:?} which is not a function or data constructor", other)), - } + match self.expression(f)? { + Constructor {name} => self.apply_data_constructor(name, args), + Func(f) => self.apply_function(f, args), + other => return Err(format!("Tried to call {:?} which is not a function or data constructor", other)), } }, Val(v) => self.value(v), @@ -179,16 +176,21 @@ impl<'a> State<'a> { } fn apply_data_constructor(&mut self, name: Rc, args: Vec) -> EvalResult { - let symbol_table = self.symbol_table_handle.borrow(); - match symbol_table.values.get(&name) { - Some(Symbol { spec: SymbolSpec::DataConstructor { type_name, type_args }, name }) => { - if args.len() != type_args.len() { - return Err(format!("Data constructor {} requires {} args", name, type_args.len())); - } - Ok(Expr::Lit(self::Lit::Custom(name.clone(), vec![]))) - }, - _ => return Err(format!("Bad symbol {}", name)) + { + let symbol_table = self.symbol_table_handle.borrow(); + match symbol_table.values.get(&name) { + Some(Symbol { spec: SymbolSpec::DataConstructor { type_name, type_args }, name }) => { + if args.len() != type_args.len() { + return Err(format!("Data constructor {} requires {} args", name, type_args.len())); + } + () + }, + _ => return Err(format!("Bad symbol {}", name)) + } } + let evaled_args = args.into_iter().map(|expr| self.expression(expr)).collect::,_>>()?; + //let evaled_args = vec![]; + Ok(Expr::Lit(self::Lit::Custom(name.clone(), evaled_args))) } fn apply_function(&mut self, f: Func, args: Vec) -> EvalResult { @@ -285,7 +287,8 @@ impl<'a> State<'a> { //in the values table let symbol_table = self.symbol_table_handle.borrow(); - Ok(match symbol_table.values.get(&name) { + let value = symbol_table.values.get(&name); + Ok(match value { Some(Symbol { name, spec }) => match spec { SymbolSpec::DataConstructor { type_name, type_args } => { if type_args.len() == 0 { diff --git a/schala-lang/src/reduced_ast.rs b/schala-lang/src/reduced_ast.rs index 6e8243c..118ea08 100644 --- a/schala-lang/src/reduced_ast.rs +++ b/schala-lang/src/reduced_ast.rs @@ -31,7 +31,6 @@ pub enum Expr { Val(Rc), Constructor { name: Rc, - args: Vec, }, Call { f: Box, @@ -102,9 +101,8 @@ impl Expression { PrefixExp(op, arg) => op.reduce(symbol_table, arg), Value(name) => { match symbol_table.values.get(name) { - Some(Symbol { name, spec: SymbolSpec::DataConstructor { type_name, type_args } }) => { - //TODO finish - Expr::Val(name.clone()) + Some(Symbol { spec: SymbolSpec::DataConstructor { type_args, .. }, .. }) => { + Expr::Constructor { name: name.clone() } }, _ => Expr::Val(name.clone()), }