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