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))) ))) (vau de (vs b) (vapply let (array (destructure_helper vs 0 (array)) b) de)))
; and a destructuring-capable lambda! ; and a destructuring-capable lambda!
lambda (vau se (p b) (let ( only_symbols (rec-lambda recurse (a i) (cond (= i (len a)) true
sym_params (map (lambda (param) (if (symbol? param) param (symbol? (idx a i)) (recurse a (+ i 1))
(str-to-symbol (str param)))) p) true false))
body (array let (flat_map_i (lambda (i x) (array (idx p i) x)) sym_params) b) lambda (vau se (p b) (if (only_symbols p 0) (vapply lambda (array p b) se)
) (wrap (eval (array vau (quote _) sym_params body) 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 ; 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)) rec-lambda (vau se (n p b) (eval (array Y (array lambda (array n) (array lambda p b))) se))