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

@@ -1,7 +1,8 @@
use std::cell::RefCell;
use std::sync::Arc;
use crate::ty::common::Symbol;
use crate::ty::internal::{AttrSet, Const, PrimOp, Value};
use crate::ty::internal::{Const, PrimOp, RecAttrSet, Thunk, Value, _Thunk};
use crate::vm::Env;
pub fn env() -> Arc<Env> {
@@ -42,15 +43,20 @@ pub fn env() -> Arc<Env> {
}),
];
let mut builtins = AttrSet::empty();
let builtins_env = Env::empty();
let map = builtins_env.enter_rec();
for primop in primops {
env.insert(
Symbol::from(format!("__{}", primop.name)),
Value::PrimOp(primop.clone()),
);
builtins.push_attr(Symbol::from(primop.name), Value::PrimOp(primop));
map.borrow_mut().insert_mut(Symbol::from(primop.name), Value::PrimOp(primop));
}
let builtins = Value::RecAttrSet(RecAttrSet::from_inner(map.clone()));
let thunk= Thunk { thunk: RefCell::new(_Thunk::Value(Box::new(builtins.clone()))), env: RefCell::default() };
thunk.capture(Arc::new(builtins_env));
map.borrow_mut().insert_mut(Symbol::from("builtins"), Value::Thunk(thunk));
env.insert(Symbol::from("builtins"), Value::AttrSet(builtins));
env.insert(Symbol::from("builtins"), builtins);
env
}