From d2215c2831ee45013e97170bff438a83b0e4fc33 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Thu, 5 Aug 2021 01:11:14 -0400 Subject: [PATCH] Fix some of the massive speed drop from destructuring lambda by checking to see if it actually needs to destrucure first. Still slower than it was, but not 10x anymore. Maybe 1.5-2x? --- prelude.kp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/prelude.kp b/prelude.kp index 642bdd3..87145c2 100644 --- a/prelude.kp +++ b/prelude.kp @@ -121,11 +121,15 @@ ))) (vau de (vs b) (vapply let (array (destructure_helper vs 0 (array)) b) de))) ; and a destructuring-capable lambda! - lambda (vau se (p b) (let ( - sym_params (map (lambda (param) (if (symbol? param) param - (str-to-symbol (str param)))) p) - body (array let (flat_map_i (lambda (i x) (array (idx p i) x)) sym_params) b) - ) (wrap (eval (array vau (quote _) sym_params body) se)))) + only_symbols (rec-lambda recurse (a i) (cond (= i (len a)) true + (symbol? (idx a i)) (recurse a (+ i 1)) + true false)) + lambda (vau se (p b) (if (only_symbols p 0) (vapply lambda (array p b) se) + (let ( + sym_params (map (lambda (param) (if (symbol? param) param + (str-to-symbol (str param)))) p) + body (array let (flat_map_i (lambda (i x) (array (idx p i) x)) sym_params) b) + ) (wrap (eval (array vau (quote _) sym_params body) se))))) ; and rec-lambda - yes it's the same definition again rec-lambda (vau se (n p b) (eval (array Y (array lambda (array n) (array lambda p b))) se))