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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user