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:
@@ -1059,6 +1059,18 @@ cat > "$TMPFILE" << 'EPOCHS'
|
||||
(epoch 2401)
|
||||
(eval "(js-eval \"'abcd'.slice('1', '3')\")")
|
||||
|
||||
;; ── Phase 11.spread: ... in arrays and calls ───────────────────
|
||||
(epoch 2500)
|
||||
(eval "(js-eval \"var a=[1,2]; var b=[...a,3,4]; b.length\")")
|
||||
(epoch 2501)
|
||||
(eval "(js-eval \"var a=[1,2]; var b=[0,...a,3]; b.join(',')\")")
|
||||
(epoch 2502)
|
||||
(eval "(js-eval \"function f(a,b,c){ return a+b+c; } var args=[1,2,3]; f(...args)\")")
|
||||
(epoch 2503)
|
||||
(eval "(js-eval \"Math.max(...[1,5,3])\")")
|
||||
(epoch 2504)
|
||||
(eval "(js-eval \"var a=[...'abc']; a.length\")")
|
||||
|
||||
EPOCHS
|
||||
|
||||
|
||||
@@ -1629,6 +1641,13 @@ check 2307 "Array.from w/ map" '"2,4,6"'
|
||||
check 2400 "charAt coerces string" '"c"'
|
||||
check 2401 "slice coerces strings" '"bc"'
|
||||
|
||||
# ── Phase 11.spread ───────────────────────────────────────────
|
||||
check 2500 "spread in array length" '4'
|
||||
check 2501 "spread middle of array" '"0,1,2,3"'
|
||||
check 2502 "spread in call args" '6'
|
||||
check 2503 "spread Math.max" '5'
|
||||
check 2504 "spread string" '3'
|
||||
|
||||
TOTAL=$((PASS + FAIL))
|
||||
if [ $FAIL -eq 0 ]; then
|
||||
echo "✓ $PASS/$TOTAL JS-on-SX tests passed"
|
||||
|
||||
Reference in New Issue
Block a user