feat: error handling
This commit is contained in:
@@ -34,24 +34,25 @@ impl PrimOpApp {
|
||||
/// arguments.
|
||||
pub fn call(
|
||||
self: &mut Rc<Self>,
|
||||
args: Vec<Value>,
|
||||
mut args: Vec<Value>,
|
||||
ctx: &mut impl EvalContext,
|
||||
) -> Result<Value> {
|
||||
if self.arity < args.len() {
|
||||
todo!()
|
||||
}
|
||||
let Some(ret) = ({
|
||||
let self_mut = Rc::make_mut(self);
|
||||
self_mut.arity -= args.len();
|
||||
self_mut.args.extend(args);
|
||||
if self_mut.arity == 0 {
|
||||
Some(ctx.call_primop(self_mut.id, std::mem::take(&mut self_mut.args)))
|
||||
} else {
|
||||
None
|
||||
let leftover = args.split_off(self.arity);
|
||||
for arg in self.args.iter().rev().cloned() {
|
||||
args.insert(0, arg);
|
||||
}
|
||||
}) else {
|
||||
return Value::PrimOpApp(self.clone()).ok();
|
||||
};
|
||||
ret
|
||||
let mut ret = ctx.call_primop(self.id, args)?;
|
||||
ret.call(leftover.into_iter().map(Ok), ctx)?;
|
||||
return Ok(ret);
|
||||
}
|
||||
let self_mut = Rc::make_mut(self);
|
||||
self_mut.arity -= args.len();
|
||||
self_mut.args.extend(args);
|
||||
if self_mut.arity == 0 {
|
||||
ctx.call_primop(self_mut.id, std::mem::take(&mut self_mut.args))
|
||||
} else {
|
||||
Ok(Value::PrimOpApp(self.clone()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user