Interpreter - Evaluate get expressions
This commit is contained in:
parent
20aa06ac25
commit
f8bcc2d703
1 changed files with 16 additions and 2 deletions
|
@ -1,7 +1,7 @@
|
||||||
use std::{cell::RefCell, rc::Rc};
|
use std::{cell::RefCell, rc::Rc};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ast::{ClassDecl, ExprNode, FunDecl, ProgramNode, StmtNode},
|
ast::{ClassDecl, ExprNode, FunDecl, GetExpr, ProgramNode, StmtNode},
|
||||||
errors::{ErrorKind, SloxError, SloxResult},
|
errors::{ErrorKind, SloxError, SloxResult},
|
||||||
resolver::ResolvedVariables,
|
resolver::ResolvedVariables,
|
||||||
tokens::{Token, TokenType},
|
tokens::{Token, TokenType},
|
||||||
|
@ -341,6 +341,7 @@ impl Interpretable for ExprNode {
|
||||||
let lambda = Function::new(None, params, body, es.environment.clone());
|
let lambda = Function::new(None, params, body, es.environment.clone());
|
||||||
Ok(Value::from(lambda).into())
|
Ok(Value::from(lambda).into())
|
||||||
}
|
}
|
||||||
|
ExprNode::Get(get_expr) => self.on_get_expression(es, get_expr),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -506,7 +507,20 @@ impl ExprNode {
|
||||||
Ok(callable.call(es, arg_values)?.into())
|
Ok(callable.call(es, arg_values)?.into())
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|| error(right_paren, "expression result is not callable")
|
|| error(right_paren, "expression result is not callable"),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Evaluate a get expression.
|
||||||
|
fn on_get_expression(
|
||||||
|
&self,
|
||||||
|
itpr_state: &mut InterpreterState,
|
||||||
|
get_expr: &GetExpr,
|
||||||
|
) -> InterpreterResult {
|
||||||
|
let instance = get_expr.instance.interpret(itpr_state)?.result();
|
||||||
|
instance.with_instance(
|
||||||
|
|instance| instance.get(&get_expr.name).map(|v| v.into()),
|
||||||
|
|| error(&get_expr.name, "only instances have properties"),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue