Browse Source

clean up tuple-fold with slice patterns

Getty Ritter 2 years ago
parent
commit
94dc05f9a4
1 changed files with 12 additions and 16 deletions
  1. 12 16
      src/interp.rs

+ 12 - 16
src/interp.rs

@@ -187,24 +187,20 @@ const BUILTINS: &[BuiltinFunc] = &[
         callback: &|state: &State, expr: ExprRef, env: &Env| -> Result<Value, Error> {
             let val = state.eval(expr, env)?;
             let args = val.as_tup()?;
-            if args.len() != 3 {
-                bail!("`tuple-fold`: expected 3 arguments, got {}", args.len());
-            }
-
-            let func = &args[0];
-            let init = &args[1];
-            let tup = &args[2];
-
-            let func = state.hnf(func)?;
-            let tup = state.hnf(tup)?;
+            if let [func, init, tup] = args {
+                let func = state.hnf(func)?;
+                let tup = state.hnf(tup)?;
+
+                let mut result = init.clone();
+                for t in tup.as_tup()? {
+                    let partial = state.eval_closure(func.as_closure()?, result)?;
+                    result = Thunk::Value(state.eval_closure(partial.as_closure()?, t.clone())?);
+                }
 
-            let mut result = init.clone();
-            for t in tup.as_tup()? {
-                let partial = state.eval_closure(func.as_closure()?, result)?;
-                result = Thunk::Value(state.eval_closure(partial.as_closure()?, t.clone())?);
+                state.hnf(&result)
+            } else {
+                bail!("`tuple-fold`: expected 3 arguments, got {}", args.len());
             }
-
-            state.hnf(&result)
         },
     },
 ];