feat: better builtins implementaion
get rid of circular references
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
use std::rc::Rc;
|
||||
|
||||
use crate::ty::internal::{Const, PrimOp, RecAttrSet, Value};
|
||||
use rpds::HashTrieMap;
|
||||
|
||||
use crate::ty::internal::{AttrSet, Const, PrimOp, Value};
|
||||
use crate::vm::{Env, VM};
|
||||
|
||||
pub fn env<'vm>(vm: &'vm VM) -> Rc<Env<'vm>> {
|
||||
@@ -41,18 +43,18 @@ pub fn env<'vm>(vm: &'vm VM) -> Rc<Env<'vm>> {
|
||||
}),
|
||||
];
|
||||
|
||||
let builtins_env = Rc::new(Env::empty());
|
||||
let map = builtins_env.clone().new_rec();
|
||||
let mut map = HashTrieMap::new();
|
||||
for primop in primops {
|
||||
let primop = Rc::new(primop);
|
||||
env.insert(
|
||||
vm.new_sym(format!("__{}", primop.name)),
|
||||
Value::PrimOp(primop.clone()),
|
||||
);
|
||||
map.insert(vm.new_sym(primop.name), Value::PrimOp(primop));
|
||||
map.insert_mut(vm.new_sym(primop.name), Value::PrimOp(primop));
|
||||
}
|
||||
let builtins = Value::RecAttrSet(RecAttrSet::from_inner(map.clone()).into());
|
||||
map.insert(vm.new_sym("builtins"), builtins.clone());
|
||||
let attrs: Rc<_> = AttrSet::from_inner(map).into();
|
||||
let mut builtins = Value::AttrSet(attrs);
|
||||
builtins.push_attr(vm.new_sym("builtins"), Value::Builtins);
|
||||
|
||||
env.insert(vm.new_sym("builtins"), builtins);
|
||||
env
|
||||
|
||||
Reference in New Issue
Block a user