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?

This commit is contained in:
Nathan Braswell
2021-08-05 01:11:14 -04:00
parent ae82af6636
commit d2215c2831

View File

@@ -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 (
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))))
) (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))