cleanup and break out functions

Signed-off-by: Ava Hahn <ava@aidanis.online>
This commit is contained in:
Ava Hahn 2023-02-12 15:30:04 -08:00
parent e6bb732f18
commit 6dcb804d34
Signed by untrusted user who does not match committer: affine
GPG key ID: 3A4645B8CF806069
2 changed files with 33 additions and 30 deletions

View file

@ -51,42 +51,46 @@ impl<'a> VTable<'a> {
}
// returns a callback for the stdlib var export function with env_sync on or off
pub fn get_export<'a> (env_cfg: bool) -> Function<'a> {
pub fn get_export<'a>(env_cfg: bool) -> Function<'a>{
return Function {
name: String::from("export"),
loose_syms: true,
eval_lazy: true,
args: Args::Lazy(2),
function: Operation::Internal(Box::new(
|ast: &Seg, vars: &mut VTable, funcs: &mut FTable| -> Ctr {
if let Ctr::Symbol(identifier) = *ast.car {
match *ast.cdr {
Ctr::Seg(ref data_tree) => match eval(&Box::new(data_tree), vars, funcs, false) {
Ok(seg) => match *seg {
Ctr::Seg(val) => {
vars.insert(identifier, val.car);
if env_cfg {
env::set_var(identifier, val.car.to_string())
}
},
_ => eprintln!("impossible args to export"),
},
Err(e) => eprintln!("couldnt eval symbol: {}", e),
},
Ctr::None => {
vars.remove(identifier);
if env_cfg {
env::remove_var(identifier);
}
},
_ => eprintln!("args not in standard form"),
}
} else {
eprintln!("first argument to export must be a symbol");
}
return Ctr::None;
move |ast: &Seg, vars: &mut VTable, funcs: &mut FTable| -> Ctr {
_export_callback(ast, vars, funcs, env_cfg)
},
)),
};
}
fn _export_callback<'a> (ast: &'a Seg, vars: &'a mut VTable, funcs: &'a mut FTable, env_cfg: bool) -> Ctr<'a> {
if let Ctr::Symbol(ref identifier) = *ast.car {
match *ast.cdr {
Ctr::Seg(data_tree) => match eval(&Box::new(data_tree), vars, funcs, false) {
Ok(seg) => match *seg {
Ctr::Seg(val) => {
vars.insert(identifier.clone(), val.car);
if env_cfg {
env::set_var(identifier.clone(), val.car.to_string())
}
},
_ => eprintln!("impossible args to export"),
},
Err(e) => eprintln!("couldnt eval symbol: {}", e),
},
Ctr::None => {
vars.remove(identifier.to_string());
if env_cfg {
env::remove_var(identifier.to_string());
}
},
_ => eprintln!("args not in standard form"),
}
} else {
eprintln!("first argument to export must be a symbol");
}
return Ctr::None;
}