feat: less clone on symbol

This commit is contained in:
2025-05-15 18:19:16 +08:00
parent 3e7a8a1c05
commit 864be73e77
12 changed files with 195 additions and 183 deletions

View File

@@ -1,14 +1,13 @@
use std::cell::RefCell;
use std::rc::Rc;
use crate::ty::common::Symbol;
use crate::ty::internal::{_Thunk, Const, PrimOp, RecAttrSet, Thunk, Value};
use crate::vm::Env;
use crate::vm::{Env, VM};
pub fn env<'vm>() -> Rc<Env<'vm>> {
pub fn env<'vm>(vm: &'vm VM) -> Rc<Env<'vm>> {
let env = Rc::new(Env::empty());
env.insert(Symbol::from("true"), Value::Const(Const::Bool(true)));
env.insert(Symbol::from("false"), Value::Const(Const::Bool(false)));
env.insert(vm.new_sym("true"), Value::Const(Const::Bool(true)));
env.insert(vm.new_sym("false"), Value::Const(Const::Bool(false)));
let primops = [
PrimOp::new("add", 2, |_, args| {
@@ -47,17 +46,17 @@ pub fn env<'vm>() -> Rc<Env<'vm>> {
let map = builtins_env.clone().new_rec();
for primop in primops {
env.insert(
Symbol::from(format!("__{}", primop.name)),
vm.new_sym(format!("__{}", primop.name)),
Value::PrimOp(primop.clone()),
);
map.insert(Symbol::from(primop.name), Value::PrimOp(primop));
map.insert(vm.new_sym(primop.name), Value::PrimOp(primop));
}
let builtins = Value::RecAttrSet(RecAttrSet::from_inner(map.clone()));
let thunk = Thunk {
thunk: Rc::new(RefCell::new(_Thunk::Value(Box::new(builtins.clone())))),
};
map.insert(Symbol::from("builtins"), Value::Thunk(thunk));
map.insert(vm.new_sym("builtins"), Value::Thunk(thunk));
env.insert(Symbol::from("builtins"), builtins);
env.insert(vm.new_sym("builtins"), builtins);
env
}