Eval shouldn't be aware of types
This commit is contained in:
parent
b4c7ea3d02
commit
98cfcfc18d
@ -7,7 +7,7 @@ use itertools::Itertools;
|
|||||||
|
|
||||||
use util::StateStack;
|
use util::StateStack;
|
||||||
use ast_reducing::{ReducedAST, Stmt, Expr, Lit, Func};
|
use ast_reducing::{ReducedAST, Stmt, Expr, Lit, Func};
|
||||||
use typechecking::{TypeContext, Symbol, Type, TConst};
|
use typechecking::{TypeContext, SymbolSpec, Symbol};
|
||||||
|
|
||||||
pub struct State<'a> {
|
pub struct State<'a> {
|
||||||
values: StateStack<'a, Rc<String>, ValueEntry>,
|
values: StateStack<'a, Rc<String>, ValueEntry>,
|
||||||
@ -266,17 +266,16 @@ impl<'a> State<'a> {
|
|||||||
|
|
||||||
let type_context = self.type_context_handle.borrow();
|
let type_context = self.type_context_handle.borrow();
|
||||||
Ok(match type_context.symbol_table.values.get(&name) {
|
Ok(match type_context.symbol_table.values.get(&name) {
|
||||||
Some(Symbol { name, ty }) => match ty {
|
Some(Symbol { name, spec }) => match spec {
|
||||||
Type::Const(TConst::Custom(_typename)) => {
|
SymbolSpec::Custom(_typename) => {
|
||||||
Expr::Lit(Lit::Custom(name.clone()))
|
Expr::Lit(Lit::Custom(name.clone()))
|
||||||
},
|
},
|
||||||
Type::Func(_,_) => match self.values.lookup(&name) {
|
SymbolSpec::Func => match self.values.lookup(&name) {
|
||||||
Some(Binding { val: Expr::Func(UserDefined { name, params, body }), .. }) => {
|
Some(Binding { val: Expr::Func(UserDefined { name, params, body }), .. }) => {
|
||||||
Expr::Func(UserDefined { name: name.clone(), params: params.clone(), body: body.clone() })
|
Expr::Func(UserDefined { name: name.clone(), params: params.clone(), body: body.clone() })
|
||||||
},
|
},
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
},
|
},
|
||||||
e => return Err(format!("Bad type in symbol table {:?}", e))
|
|
||||||
},
|
},
|
||||||
/* see if it's an ordinary variable TODO make variables go in symbol table */
|
/* see if it's an ordinary variable TODO make variables go in symbol table */
|
||||||
None => match self.values.lookup(&name) {
|
None => match self.values.lookup(&name) {
|
||||||
|
@ -28,7 +28,12 @@ impl SymbolTable {
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Symbol {
|
pub struct Symbol {
|
||||||
pub name: Rc<String>,
|
pub name: Rc<String>,
|
||||||
pub ty: Type
|
pub spec: SymbolSpec,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum SymbolSpec {
|
||||||
|
Func, Custom(String)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone)]
|
#[derive(Debug, PartialEq, Clone)]
|
||||||
@ -159,7 +164,7 @@ impl TypeContext {
|
|||||||
*/
|
*/
|
||||||
self.symbol_table.values.insert(
|
self.symbol_table.values.insert(
|
||||||
signature.name.clone(),
|
signature.name.clone(),
|
||||||
Symbol { name: signature.name.clone(), ty: Func(Box::new(Void), Box::new(Void)) }
|
Symbol { name: signature.name.clone(), spec: SymbolSpec::Func }
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
TypeDecl(TypeSingletonName { name, ..}, TypeBody(variants)) => {
|
TypeDecl(TypeSingletonName { name, ..}, TypeBody(variants)) => {
|
||||||
@ -167,8 +172,8 @@ impl TypeContext {
|
|||||||
match var {
|
match var {
|
||||||
Variant::UnitStruct(variant_name) => {
|
Variant::UnitStruct(variant_name) => {
|
||||||
//TODO will have to make this a function to this type eventually
|
//TODO will have to make this a function to this type eventually
|
||||||
let ty = Type::Const(TConst::Custom(format!("{}", name)));
|
let spec = SymbolSpec::Custom(format!("{}", name));
|
||||||
self.symbol_table.values.insert(variant_name.clone(), Symbol { name: variant_name.clone(), ty });
|
self.symbol_table.values.insert(variant_name.clone(), Symbol { name: variant_name.clone(), spec });
|
||||||
},
|
},
|
||||||
e => return Err(format!("{:?} not supported in typing yet", e)),
|
e => return Err(format!("{:?} not supported in typing yet", e)),
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user