js-on-sx: Array.prototype flat + fill; fix indexOf start arg
flat: walk with depth, recursive when element is list and depth>0. fill(value, start?, end?): in-place mutation, returns self. indexOf: honor second arg as start position. 396/398 unit (+5), 148/148 slice unchanged.
This commit is contained in:
@@ -775,7 +775,13 @@
|
|||||||
((= name "indexOf")
|
((= name "indexOf")
|
||||||
(fn
|
(fn
|
||||||
(&rest args)
|
(&rest args)
|
||||||
(if (= (len args) 0) -1 (js-list-index-of arr (nth args 0) 0))))
|
(if
|
||||||
|
(= (len args) 0)
|
||||||
|
-1
|
||||||
|
(js-list-index-of
|
||||||
|
arr
|
||||||
|
(nth args 0)
|
||||||
|
(if (< (len args) 2) 0 (js-num-to-int (nth args 1)))))))
|
||||||
((= name "join")
|
((= name "join")
|
||||||
(fn
|
(fn
|
||||||
(&rest args)
|
(&rest args)
|
||||||
@@ -810,6 +816,25 @@
|
|||||||
((= name "every") (fn (f) (js-list-every-loop f arr 0)))
|
((= name "every") (fn (f) (js-list-every-loop f arr 0)))
|
||||||
((= name "reverse")
|
((= name "reverse")
|
||||||
(fn () (js-list-reverse-loop arr (- (len arr) 1) (list))))
|
(fn () (js-list-reverse-loop arr (- (len arr) 1) (list))))
|
||||||
|
((= name "flat")
|
||||||
|
(fn
|
||||||
|
(&rest args)
|
||||||
|
(let
|
||||||
|
((depth (if (= (len args) 0) 1 (js-num-to-int (nth args 0)))))
|
||||||
|
(js-list-flat-loop arr depth (list)))))
|
||||||
|
((= name "fill")
|
||||||
|
(fn
|
||||||
|
(&rest args)
|
||||||
|
(let
|
||||||
|
((v (if (= (len args) 0) js-undefined (nth args 0)))
|
||||||
|
(s (if (< (len args) 2) 0 (js-num-to-int (nth args 1))))
|
||||||
|
(e
|
||||||
|
(if
|
||||||
|
(< (len args) 3)
|
||||||
|
(len arr)
|
||||||
|
(js-num-to-int (nth args 2)))))
|
||||||
|
(js-list-fill-loop arr v s e)
|
||||||
|
arr)))
|
||||||
(else js-undefined))))
|
(else js-undefined))))
|
||||||
|
|
||||||
(define pop-last! (fn (lst) nil))
|
(define pop-last! (fn (lst) nil))
|
||||||
@@ -960,6 +985,30 @@
|
|||||||
((js-to-boolean (f (nth arr i))) true)
|
((js-to-boolean (f (nth arr i))) true)
|
||||||
(else (js-list-some-loop f arr (+ i 1))))))
|
(else (js-list-some-loop f arr (+ i 1))))))
|
||||||
|
|
||||||
|
(define
|
||||||
|
js-list-flat-loop
|
||||||
|
(fn
|
||||||
|
(arr depth acc)
|
||||||
|
(for-each
|
||||||
|
(fn
|
||||||
|
(x)
|
||||||
|
(if
|
||||||
|
(and (list? x) (> depth 0))
|
||||||
|
(js-list-flat-loop x (- depth 1) acc)
|
||||||
|
(append! acc x)))
|
||||||
|
arr)
|
||||||
|
acc))
|
||||||
|
|
||||||
|
(define
|
||||||
|
js-list-fill-loop
|
||||||
|
(fn
|
||||||
|
(arr v s e)
|
||||||
|
(cond
|
||||||
|
((>= s e) nil)
|
||||||
|
((>= s (len arr)) nil)
|
||||||
|
(else
|
||||||
|
(begin (js-list-set! arr s v) (js-list-fill-loop arr v (+ s 1) e))))))
|
||||||
|
|
||||||
(define
|
(define
|
||||||
js-list-every-loop
|
js-list-every-loop
|
||||||
(fn
|
(fn
|
||||||
@@ -1219,6 +1268,8 @@
|
|||||||
((= key "some") (js-array-method obj "some"))
|
((= key "some") (js-array-method obj "some"))
|
||||||
((= key "every") (js-array-method obj "every"))
|
((= key "every") (js-array-method obj "every"))
|
||||||
((= key "reverse") (js-array-method obj "reverse"))
|
((= key "reverse") (js-array-method obj "reverse"))
|
||||||
|
((= key "flat") (js-array-method obj "flat"))
|
||||||
|
((= key "fill") (js-array-method obj "fill"))
|
||||||
(else js-undefined)))
|
(else js-undefined)))
|
||||||
((= (type-of obj) "string")
|
((= (type-of obj) "string")
|
||||||
(cond
|
(cond
|
||||||
|
|||||||
@@ -1015,6 +1015,18 @@ cat > "$TMPFILE" << 'EPOCHS'
|
|||||||
(epoch 2009)
|
(epoch 2009)
|
||||||
(eval "(js-eval \"JSON.parse('{\\\"a\\\":1}').a\")")
|
(eval "(js-eval \"JSON.parse('{\\\"a\\\":1}').a\")")
|
||||||
|
|
||||||
|
;; ── Phase 11.array2: flat + fill + indexOf start ───────────────
|
||||||
|
(epoch 2100)
|
||||||
|
(eval "(js-eval \"[1,[2,3],4].flat().length\")")
|
||||||
|
(epoch 2101)
|
||||||
|
(eval "(js-eval \"[1,[2,[3]]].flat(2).length\")")
|
||||||
|
(epoch 2102)
|
||||||
|
(eval "(js-eval \"[1,2,3].fill(0).join(',')\")")
|
||||||
|
(epoch 2103)
|
||||||
|
(eval "(js-eval \"[1,2,3,4].fill(0, 1, 3).join(',')\")")
|
||||||
|
(epoch 2104)
|
||||||
|
(eval "(js-eval \"[1,2,1,2].indexOf(2, 2)\")")
|
||||||
|
|
||||||
EPOCHS
|
EPOCHS
|
||||||
|
|
||||||
|
|
||||||
@@ -1559,6 +1571,13 @@ check 2007 "parse string" '"hello"'
|
|||||||
check 2008 "parse array length" '3'
|
check 2008 "parse array length" '3'
|
||||||
check 2009 "parse object.a" '1'
|
check 2009 "parse object.a" '1'
|
||||||
|
|
||||||
|
# ── Phase 11.array2 ────────────────────────────────────────────
|
||||||
|
check 2100 "flat() depth 1" '4'
|
||||||
|
check 2101 "flat(2)" '3'
|
||||||
|
check 2102 "fill(0)" '"0,0,0"'
|
||||||
|
check 2103 "fill(0,1,3)" '"1,0,0,4"'
|
||||||
|
check 2104 "indexOf with start" '3'
|
||||||
|
|
||||||
TOTAL=$((PASS + FAIL))
|
TOTAL=$((PASS + FAIL))
|
||||||
if [ $FAIL -eq 0 ]; then
|
if [ $FAIL -eq 0 ]; then
|
||||||
echo "✓ $PASS/$TOTAL JS-on-SX tests passed"
|
echo "✓ $PASS/$TOTAL JS-on-SX tests passed"
|
||||||
|
|||||||
Reference in New Issue
Block a user