feat: simple functions

This commit is contained in:
2025-05-04 14:42:22 +08:00
parent 6ecd20854a
commit bc50464db9
6 changed files with 77 additions and 27 deletions

View File

@@ -1,11 +1,9 @@
use std::ops::Index;
use anyhow::Result;
use anyhow::{Result, anyhow};
use crate::builtins::env;
use crate::bytecode::{self, Program, OpCode, OpCodes, Thunks, UnOp, BinOp};
use crate::ty::internal::*;
use crate::bytecode::{self, BinOp, OpCode, OpCodes, Program, Thunks, UnOp};
use crate::ty::common::Symbol;
use crate::ty::internal::*;
use crate::ty::public as p;
use super::env::Env;
@@ -81,19 +79,31 @@ impl VM {
args.insert(0, stack.pop()?);
}
let func = stack.pop()?;
stack.push(func.call(args))?;
stack.push(func.call(self, args))?;
}
OpCode::Func { idx } => {
stack.push(Value::Func(Func::new(self.thunks[idx].unwrap_code())))?;
stack.push(Value::Func(Func::new(env.locked(), self.thunks[idx].unwrap_code())))?;
}
OpCode::PushIdentParam { sym } => {
stack.tos_mut()?.as_mut().unwrap_func().push_ident_param(sym);
stack
.tos_mut()?
.as_mut()
.unwrap_func()
.push_ident_param(sym);
}
OpCode::PushFormalParam { sym } => {
stack.tos_mut()?.as_mut().unwrap_func().push_formal_param(sym);
stack
.tos_mut()?
.as_mut()
.unwrap_func()
.push_formal_param(sym);
}
OpCode::PushDefaultParam { idx } => {
stack.tos_mut()?.as_mut().unwrap_func().push_default_param(idx);
stack
.tos_mut()?
.as_mut()
.unwrap_func()
.push_default_param(idx);
}
OpCode::SetEllipsis => {
stack.tos_mut()?.as_mut().unwrap_func().set_ellipsis();
@@ -184,7 +194,10 @@ impl VM {
stack.tos_mut()?.has_attr(sym);
}
OpCode::LookUp { sym } => {
stack.push(env.lookup(Symbol::new(sym)))?;
stack.push(
env.lookup(Symbol::new(sym.clone()))
.ok_or(anyhow!(r#""{sym}" not found"#))?,
)?;
}
OpCode::EnterEnv => {
env.enter(stack.pop()?.unwrap_attr_set().to_data());