diff --git a/schala-lang/src/builtin.rs b/schala-lang/src/builtin.rs index e89bff1..8fe0504 100644 --- a/schala-lang/src/builtin.rs +++ b/schala-lang/src/builtin.rs @@ -1,7 +1,6 @@ use std::rc::Rc; use std::collections::HashMap; use std::fmt; -use std::fmt::Write; use self::Type::*; use self::TConstOld::*; diff --git a/schala-lang/src/eval.rs b/schala-lang/src/eval.rs index 83a322f..a83a182 100644 --- a/schala-lang/src/eval.rs +++ b/schala-lang/src/eval.rs @@ -140,11 +140,20 @@ impl<'a> State<'a> { match expr { literal @ Lit(_) => Ok(literal), Call { box f, args } => { - let f = match self.expression(f)? { - Func(f) => f, - other => return Err(format!("Tried to call {:?} which is not a function", other)), - }; - self.apply_function(f, args) + if let Val(name) = f { + let symbol_table = self.symbol_table_handle.borrow(); + match symbol_table.values.get(&name) { + Some(Symbol { spec: SymbolSpec::DataConstructor { type_name, type_args }, .. }) => { + Ok(Expr::Lit(self::Lit::Nat(99))) + }, + _ => return Err(format!("Bad symbol {}", name)) + } + } 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)), + } + } }, Val(v) => self.value(v), func @ Func(_) => Ok(func),