js-on-sx: spread ... in array literals and call args

Parser: jp-array-loop and jp-call-args-loop detect punct "..."
and emit (js-spread inner).

Transpile: when any element is spread, build array/args via
js-array-spread-build with (list "js-value" v) and (list
"js-spread" xs) tags.

Runtime: js-array-spread-build walks items, appending values or
splicing spreads via js-iterable-to-list (handles list/string/dict).

Works in arrays, call args, variadic fns (Math.max(...arr)),
and string spread ([...'abc']).

414/416 unit (+5), 148/148 slice unchanged.
This commit is contained in:
2026-04-23 22:10:15 +00:00
parent b502b8f58e
commit 4800246b23
5 changed files with 137 additions and 24 deletions

View File

@@ -1750,6 +1750,26 @@
(define Object {:entries js-object-entries :values js-object-values :freeze js-object-freeze :assign js-object-assign :keys js-object-keys})
(define
js-array-spread-build
(fn
(&rest items)
(let
((result (list)))
(for-each
(fn
(item)
(let
((kind (nth item 0)))
(cond
((= kind "js-spread")
(for-each
(fn (x) (append! result x))
(js-iterable-to-list (nth item 1))))
(else (append! result (nth item 1))))))
items)
result)))
(define js-array-is-array (fn (v) (list? v)))
(define js-array-of (fn (&rest args) args))