feat: recursive builtins

This commit is contained in:
2025-05-05 16:43:14 +08:00
parent bd783f1b96
commit 550ad54f30
11 changed files with 134 additions and 126 deletions

View File

@@ -2,7 +2,7 @@ use ecow::EcoString;
use itertools::Itertools;
use rpds::HashTrieMap;
use crate::bytecode::{OpCodes, ThunkIdx};
use crate::bytecode::OpCodes;
use crate::ty::internal::{Thunk, Value};
use crate::vm::{CapturedEnv, VM};
@@ -11,7 +11,7 @@ use crate::vm::{CapturedEnv, VM};
pub enum Param {
Ident(EcoString),
Formals {
formals: Vec<(EcoString, Option<ThunkIdx>)>,
formals: Vec<(EcoString, Option<Thunk>)>,
ellipsis: bool,
alias: Option<EcoString>,
},
@@ -60,7 +60,7 @@ impl Func {
for (formal, default) in formals {
let arg = arg
.select(formal.clone().into())
.or_else(|| default.map(|idx| Value::Thunk(Thunk(idx))))
.or_else(|| default.map(|thunk| Value::Thunk(thunk)))
.unwrap();
new.insert_mut(formal.into(), arg);
}
@@ -89,7 +89,7 @@ impl Func {
formals.push((param, None));
}
pub fn push_default_param(&mut self, default: ThunkIdx) {
pub fn push_default_param(&mut self, default: Thunk) {
let Param::Formals { formals, .. } = self.param.as_mut().unwrap() else {
panic!()
};