refactor: builtins, value

This commit is contained in:
2025-05-03 17:04:28 +08:00
parent 030c61df52
commit 3f0cb2c2fa
9 changed files with 123 additions and 119 deletions

View File

@@ -1,8 +1,6 @@
use derive_more::Constructor;
use super::vm::Env;
use super::vm::Symbol;
use super::vm::Value;
use crate::vm::{Env, Symbol, Value, AttrSet};
use crate::value::Const;
pub fn env() -> Env {
@@ -10,42 +8,39 @@ pub fn env() -> Env {
env.insert(Symbol::from("true"), Value::Const(Const::Bool(true)));
env.insert(Symbol::from("false"), Value::Const(Const::Bool(false)));
env.insert(
Symbol::from("__add"),
Value::PrimOp(PrimOp::new("add", 2, |args| {
let primops = [
PrimOp::new("add", 2, |args| {
let [first, second]: [Value; 2] = args.try_into().unwrap();
first.add(second)
})),
);
env.insert(
Symbol::from("__sub"),
Value::PrimOp(PrimOp::new("sub", 2, |args| {
}),
PrimOp::new("sub", 2, |args| {
let [first, second]: [Value; 2] = args.try_into().unwrap();
first.add(second.neg())
})),
);
env.insert(
Symbol::from("__mul"),
Value::PrimOp(PrimOp::new("mul", 2, |args| {
}),
PrimOp::new("mul", 2, |args| {
let [first, second]: [Value; 2] = args.try_into().unwrap();
first.mul(second)
})),
);
env.insert(
Symbol::from("__div"),
Value::PrimOp(PrimOp::new("div", 2, |args| {
}),
PrimOp::new("div", 2, |args| {
let [first, second]: [Value; 2] = args.try_into().unwrap();
first.div(second)
})),
);
env.insert(
Symbol::from("__lessThan"),
Value::PrimOp(PrimOp::new("lessThan", 2, |args| {
}),
PrimOp::new("lessThan", 2, |args| {
let [first, second]: [Value; 2] = args.try_into().unwrap();
first.lt(second)
})),
);
})
];
let mut builtins = AttrSet::empty();
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));
}
env.insert(Symbol::from("builtins"), Value::AttrSet(builtins));
env
}