feat: eval/apply functions
This commit is contained in:
parent
2d93c83b67
commit
c596e00be8
2 changed files with 30 additions and 0 deletions
27
src/env/core.rs
vendored
27
src/env/core.rs
vendored
|
@ -8,6 +8,33 @@ use crate::node::Node;
|
||||||
|
|
||||||
pub(super) fn core() -> HashMap<String, Node> {
|
pub(super) fn core() -> HashMap<String, Node> {
|
||||||
[
|
[
|
||||||
|
// Meta
|
||||||
|
(
|
||||||
|
"eval",
|
||||||
|
Node::NativeFunc(|env, args| {
|
||||||
|
arg_count!(1, args.len());
|
||||||
|
let ast = args.into_iter().next().unwrap();
|
||||||
|
eval_node(env, ast)
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"apply",
|
||||||
|
Node::NativeFunc(|env, args| {
|
||||||
|
arg_count!(2, args.len());
|
||||||
|
|
||||||
|
let mut args = args.into_iter();
|
||||||
|
let operator = args.next().unwrap();
|
||||||
|
let args = match args.next().unwrap() {
|
||||||
|
Node::List(list) => list,
|
||||||
|
_ => Err(Error::ExpectedList)?,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut list = vec![operator];
|
||||||
|
list.extend(args);
|
||||||
|
|
||||||
|
eval_node(env, Node::List(list))
|
||||||
|
}),
|
||||||
|
),
|
||||||
// Arithmetic operations
|
// Arithmetic operations
|
||||||
(
|
(
|
||||||
"+",
|
"+",
|
||||||
|
|
|
@ -92,6 +92,9 @@ mod test {
|
||||||
#[case(":owo", ":owo")]
|
#[case(":owo", ":owo")]
|
||||||
#[case("()", "()")]
|
#[case("()", "()")]
|
||||||
#[case("nil", "()")]
|
#[case("nil", "()")]
|
||||||
|
// Meta
|
||||||
|
#[case("(eval (list + 1 1))", "2")]
|
||||||
|
#[case("(apply + (list 1 2 3))", "6")]
|
||||||
// Arithmetic
|
// Arithmetic
|
||||||
#[case("(+ 1 2)", "3")]
|
#[case("(+ 1 2)", "3")]
|
||||||
#[case("(- 5 1)", "4")]
|
#[case("(- 5 1)", "4")]
|
||||||
|
|
Loading…
Reference in a new issue