Browse Source

add tuple/map into stdlib

Getty Ritter 1 year ago
parent
commit
3be34d3ba2
1 changed files with 20 additions and 0 deletions
  1. 20 0
      src/builtins.rs

+ 20 - 0
src/builtins.rs

@@ -200,5 +200,25 @@ pub fn builtins() -> Vec<BuiltinFunc> {
                 }
             }),
         },
+
+        BuiltinFunc {
+            name: "tuple/map",
+            callback: Box::new(|state: &State, exprs: &[ExprRef], env: &Env| -> Result<Value, Error> {
+                if let [func, tup] = exprs {
+                    let func = state.eval(*func, env)?;
+                    let tup = state.eval(*tup, env)?;
+
+                    let mut new_tup = Vec::new();
+                    let closure = func.as_closure(&state.ast.borrow())?;
+                    for t in tup.as_tup(&state.ast.borrow())? {
+                        new_tup.push(Thunk::Value(state.eval_closure(closure, vec![t.clone()])?));
+                    }
+
+                    Ok(Value::Tup(new_tup))
+                } else {
+                    bail!("`tuple/map`: expected 2 arguments, got {}", exprs.len());
+                }
+            }),
+        },
     ]
 }