diff --git a/schala-lang/language/src/eval.rs b/schala-lang/language/src/eval.rs index 6a629fc..a9d99c5 100644 --- a/schala-lang/language/src/eval.rs +++ b/schala-lang/language/src/eval.rs @@ -482,6 +482,7 @@ impl<'a> State<'a> { }, _ => unreachable!(), }, + SymbolSpec::RecordConstructor { .. } => return Err(format!("This shouldn't be a record!")), }, /* see if it's an ordinary variable TODO make variables go in symbol table */ None => match self.values.lookup(&name) { diff --git a/schala-lang/language/src/symbol_table.rs b/schala-lang/language/src/symbol_table.rs index b845c17..5ec5752 100644 --- a/schala-lang/language/src/symbol_table.rs +++ b/schala-lang/language/src/symbol_table.rs @@ -44,6 +44,9 @@ pub enum SymbolSpec { type_name: Rc, type_args: Vec>, }, + RecordConstructor { + fields: HashMap, Rc> + } } impl fmt::Display for SymbolSpec { @@ -52,6 +55,7 @@ impl fmt::Display for SymbolSpec { match self { Func(type_names) => write!(f, "Func({:?})", type_names), DataConstructor { index, type_name, type_args } => write!(f, "DataConstructor(idx: {})({:?} -> {})", index, type_args, type_name), + RecordConstructor { fields } => write!(f, "RecordConstructor( )"), } } } @@ -124,7 +128,14 @@ impl SymbolTable { let symbol = Symbol { name: variant_name.clone(), spec }; self.values.insert(variant_name.clone(), symbol); }, - Variant::Record { .. } => return Err(format!("Record types not supported yet")), + //TODO if there is only one variant, and it is a record, it doesn't need to have an + //explicit name + Variant::Record { name, members } => { + let fields = HashMap::new(); + let spec = SymbolSpec::RecordConstructor { fields }; + let symbol = Symbol { name: name.clone(), spec }; + self.values.insert(name.clone(), symbol); + }, } } Ok(())