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

@@ -486,11 +486,18 @@
(cond
((jp-at? st "punct" "]") nil)
(else
(do
(append! elems (jp-parse-assignment st))
(begin
(cond
((jp-at? st "punct" "...")
(begin
(jp-advance! st)
(append!
elems
(list (quote js-spread) (jp-parse-assignment st)))))
(else (append! elems (jp-parse-assignment st))))
(cond
((jp-at? st "punct" ",")
(do (jp-advance! st) (jp-array-loop st elems)))
(begin (jp-advance! st) (jp-array-loop st elems)))
(else nil)))))))
;; ── Entry point ─────────────────────────────────────────────────
@@ -600,11 +607,18 @@
(cond
((jp-at? st "punct" ")") nil)
(else
(do
(append! args (jp-parse-assignment st))
(begin
(cond
((jp-at? st "punct" "...")
(begin
(jp-advance! st)
(append!
args
(list (quote js-spread) (jp-parse-assignment st)))))
(else (append! args (jp-parse-assignment st))))
(cond
((jp-at? st "punct" ",")
(do (jp-advance! st) (jp-call-args-loop st args)))
(begin (jp-advance! st) (jp-call-args-loop st args)))
(else nil)))))))
(define