Error Messaging Redesign

This commit contains the following:

* New data types to support full tracebacks
* New traceback data type used across stl and ast
* Updates to tests
* fixes for error messaging in sym and some stl functions
This commit is contained in:
Ava Apples Affine 2023-05-23 22:06:11 +00:00
parent 91ad4eed12
commit 789349df48
24 changed files with 837 additions and 374 deletions

View file

@ -17,12 +17,13 @@
use crate::segment::{Ctr, Seg};
use crate::sym::{SymTable, call_lambda};
use crate::error::Traceback;
/* iterates over a syntax tree
* returns a NEW LIST of values
* representing the simplest possible form of the input
*/
pub fn eval(ast: &Seg, syms: &mut SymTable) -> Result<Box<Ctr>, String> {
pub fn eval(ast: &Seg, syms: &mut SymTable) -> Result<Box<Ctr>, Traceback> {
// data to return
let mut ret = Box::from(Ctr::None);
let mut first = true;
@ -42,10 +43,7 @@ pub fn eval(ast: &Seg, syms: &mut SymTable) -> Result<Box<Ctr>, String> {
Ctr::Seg(ref inner) => {
let interm = eval(inner, syms)?;
if let Ctr::Lambda(ref l) = *interm {
match call_lambda(l, arg_cdr, syms) {
Ok(s) => return Ok(s.clone()),
Err(s) => return Err(format!("err in call to lambda: {}", s)),
}
return call_lambda(l, arg_cdr, syms)
} else {
car = interm;
}
@ -63,11 +61,7 @@ pub fn eval(ast: &Seg, syms: &mut SymTable) -> Result<Box<Ctr>, String> {
args = &outer_scope_seg_holder;
}
match syms.call_symbol(tok, args, first) {
Ok(s) => car = s,
Err(s) => return Err(format!("error in call to {}: {}", tok, s)),
}
car = syms.call_symbol(tok, args, first)?;
if let Some(b) = syms.is_function_type(tok) {
if b {
return Ok(car);
@ -83,10 +77,7 @@ pub fn eval(ast: &Seg, syms: &mut SymTable) -> Result<Box<Ctr>, String> {
match **arg_cdr {
Ctr::Symbol(ref tok) => {
let blank = Seg::new();
match syms.call_symbol(tok, &blank, false) {
Ok(res) => cdr = res,
Err(s) => return Err(format!("error fetching {}: {}", tok, s)),
}
cdr = syms.call_symbol(tok, &blank, false)?;
none = true;
}