feat: usable?

This commit is contained in:
2025-05-05 11:31:46 +08:00
parent eea4a4ce9f
commit b9dcc83c39
24 changed files with 688 additions and 244 deletions

View File

@@ -1,33 +1,45 @@
use crate::vm::Env;
use crate::ty::internal::{Const, Value, AttrSet, PrimOp};
use crate::ty::common::Symbol;
use std::sync::Arc;
pub fn env() -> Env {
let mut env = Env::empty();
use crate::ty::common::Symbol;
use crate::ty::internal::{AttrSet, Const, PrimOp, Value};
use crate::vm::Env;
pub fn env() -> Arc<Env> {
let env = Arc::new(Env::empty());
env.insert(Symbol::from("true"), Value::Const(Const::Bool(true)));
env.insert(Symbol::from("false"), Value::Const(Const::Bool(false)));
let primops = [
PrimOp::new("add", 2, |args| {
PrimOp::new("add", 2, |_, args| {
let [first, second]: [Value; 2] = args.try_into().unwrap();
first.add(second)
}),
PrimOp::new("sub", 2, |args| {
PrimOp::new("sub", 2, |_, args| {
let [first, second]: [Value; 2] = args.try_into().unwrap();
first.add(second.neg())
}),
PrimOp::new("mul", 2, |args| {
PrimOp::new("mul", 2, |_, args| {
let [first, second]: [Value; 2] = args.try_into().unwrap();
first.mul(second)
}),
PrimOp::new("div", 2, |args| {
PrimOp::new("div", 2, |_, args| {
let [first, second]: [Value; 2] = args.try_into().unwrap();
first.div(second)
}),
PrimOp::new("lessThan", 2, |args| {
PrimOp::new("lessThan", 2, |_, args| {
let [first, second]: [Value; 2] = args.try_into().unwrap();
first.lt(second)
})
}),
PrimOp::new("seq", 2, |vm, args| {
let [mut first, second]: [Value; 2] = args.try_into().unwrap();
first.force(vm).unwrap();
second
}),
PrimOp::new("deepSeq", 2, |vm, args| {
let [mut first, second]: [Value; 2] = args.try_into().unwrap();
first.force_deep(vm).unwrap();
second
}),
];
let mut builtins = AttrSet::empty();
@@ -42,4 +54,3 @@ pub fn env() -> Env {
env.insert(Symbol::from("builtins"), Value::AttrSet(builtins));
env
}