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