Successfully constructing a record

Not yet destructing it
This commit is contained in:
greg 2019-08-12 12:46:18 -07:00
parent a8efe40b57
commit e750247134
2 changed files with 18 additions and 12 deletions

View File

@ -183,19 +183,24 @@ fn reduce_lambda(params: &Vec<FormalParam>, body: &Block, symbol_table: &SymbolT
} }
fn reduce_named_struct(name: &Rc<String>, fields: &Vec<(Rc<String>, Meta<Expression>)>, symbol_table: &SymbolTable) -> Expr { fn reduce_named_struct(name: &Rc<String>, fields: &Vec<(Rc<String>, Meta<Expression>)>, symbol_table: &SymbolTable) -> Expr {
let (type_name, table_fields) = match symbol_table.lookup_by_name(name) { let (type_name, index, members_from_table) = match symbol_table.lookup_by_name(name) {
Some(Symbol { spec: SymbolSpec::RecordConstructor { members, type_name }, .. }) => (type_name, members), Some(Symbol { spec: SymbolSpec::RecordConstructor { members, type_name, index }, .. }) => (type_name.clone(), index, members),
_ => return Expr::ReductionError("Not a record constructor".to_string()), _ => return Expr::ReductionError("Not a record constructor".to_string()),
}; };
/* let arity = members_from_table.len();
let arity = table_fields.len();
let f = Expr::Constructor { let mut args: Vec<(Rc<String>, Expr)> = fields.iter()
type_name, arity, .map(|(name, expr)| (name.clone(), expr.node().reduce(symbol_table)))
}; .collect();
let args = fields.map(;
args.as_mut_slice()
.sort_unstable_by(|(name1, _), (name2, _)| name1.cmp(name2)); //arbitrary - sorting by alphabetical order
let args = args.into_iter().map(|(_, expr)| expr).collect();
//TODO make sure this sorting actually works
let f = box Expr::Constructor { type_name, name: name.clone(), tag: *index, arity, };
Expr::Call { f, args } Expr::Call { f, args }
*/
panic!("Still not done")
} }
fn reduce_call_expression(func: &Meta<Expression>, arguments: &Vec<Meta<InvocationArgument>>, symbol_table: &SymbolTable) -> Expr { fn reduce_call_expression(func: &Meta<Expression>, arguments: &Vec<Meta<InvocationArgument>>, symbol_table: &SymbolTable) -> Expr {

View File

@ -81,6 +81,7 @@ pub enum SymbolSpec {
type_args: Vec<Rc<String>>, type_args: Vec<Rc<String>>,
}, },
RecordConstructor { RecordConstructor {
index: usize,
members: HashMap<Rc<String>, TypeName>, members: HashMap<Rc<String>, TypeName>,
type_name: TypeName, type_name: TypeName,
}, },
@ -93,7 +94,7 @@ impl fmt::Display for SymbolSpec {
match self { match self {
Func(type_names) => write!(f, "Func({:?})", type_names), Func(type_names) => write!(f, "Func({:?})", type_names),
DataConstructor { index, type_name, type_args } => write!(f, "DataConstructor(idx: {})({:?} -> {})", index, type_args, type_name), DataConstructor { index, type_name, type_args } => write!(f, "DataConstructor(idx: {})({:?} -> {})", index, type_args, type_name),
RecordConstructor { type_name, ..} => write!(f, "RecordConstructor(<members> -> {})", type_name), RecordConstructor { type_name, index, ..} => write!(f, "RecordConstructor(idx: {})(<members> -> {})", index, type_name),
Binding => write!(f, "Binding"), Binding => write!(f, "Binding"),
} }
} }
@ -226,7 +227,7 @@ impl SymbolTable {
if duplicate_member_definitions.len() != 0 { if duplicate_member_definitions.len() != 0 {
return Err(format!("Duplicate member(s) in definition of type {}: {:?}", type_name, duplicate_member_definitions)); return Err(format!("Duplicate member(s) in definition of type {}: {:?}", type_name, duplicate_member_definitions));
} }
let spec = SymbolSpec::RecordConstructor { type_name: type_name.clone(), members }; let spec = SymbolSpec::RecordConstructor { index, type_name: type_name.clone(), members };
self.add_new_symbol(name, scope_name_stack, spec); self.add_new_symbol(name, scope_name_stack, spec);
}, },
} }