feat: recursive builtins
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user