Round 2 of the persistent-collections work. Add a real 32-way branching-trie persistent vector (src/jolt/pv.janet) with a tail buffer: O(log32 n) conj/assoc/nth/pop, with unchanged subtrees shared by identity. Vector literals and vec/vector/conj/assoc/subvec/etc. now produce and maintain these in the default (immutable) build, replacing the old tuple-based vectors. Every core seq op, the destructurer, IFn application, the printers, =, and the evaluator's literal/splice paths were taught to handle the pvec type. Define several Clojure seq fns that were silently leaking to Janet builtins (some, keep, interleave, flatten, mapcat, interpose) and broke once vectors became tables; normalize collections through realize-for-iteration everywhere. Build-time JOLT_MUTABLE flag now selects fast Janet-native mutable collections: in that mode vectors are arrays (conj appends in place, vector? true, print []), sharing one representation with lists. Default build is immutable. Tests: conformance 206/206, features 71/71, jank 119 (baseline). Test helpers normalized so Janet-level = compares against tuple literals regardless of repr. The 2 test-load-sci failures (bit-clear/get-method) pre-date this work.
42 lines
1.7 KiB
Text
42 lines
1.7 KiB
Text
(use ../src/jolt/api)
|
|
(defn ct-eval [ctx s] (normalize-pvecs (eval-string ctx s)))
|
|
(print "CLJS Collections Ported Tests")
|
|
|
|
(print "1: dissoc...")
|
|
(let [ctx (init)]
|
|
(assert (= true (ct-eval ctx "(= {:a :b} (dissoc {:a :b :c :d} :c))")) "dissoc")
|
|
(assert (= true (ct-eval ctx "(= {} (dissoc {1 2 3 4} 1 3))")) "dissoc multi"))
|
|
(print " ok")
|
|
|
|
(print "2: assoc...")
|
|
(let [ctx (init)]
|
|
(assert (= true (ct-eval ctx "(= {1 2 3 4} (assoc {} 1 2 3 4))")) "assoc multi")
|
|
(assert (= true (ct-eval ctx "(= {1 2} (assoc {} 1 2))")) "assoc single"))
|
|
(print " ok")
|
|
|
|
(print "3: set operations...")
|
|
(let [ctx (init)]
|
|
(assert (= true (ct-eval ctx "(set? (set []))")) "set empty")
|
|
(assert (= true (ct-eval ctx "(= #{\"foo\"} (set [\"foo\"]))")) "set from vec")
|
|
(assert (= true (ct-eval ctx "(= #{1 2 3} #{1 3 2})")) "set order")
|
|
(assert (= true (ct-eval ctx "(= #{1 2 3} (disj #{1 2 3}))")) "disj none")
|
|
(assert (= true (ct-eval ctx "(= #{1 2} (disj #{1 2 3} 3))")) "disj one")
|
|
(assert (= true (ct-eval ctx "(= #{1} (disj #{1 2 3} 2 3))")) "disj multi")
|
|
(assert (= true (ct-eval ctx "(= 4 (get #{1 2 3 4} 4))")) "get set")
|
|
(assert (= true (ct-eval ctx "(contains? #{1 2 3 4} 4)")) "contains? set"))
|
|
(print " ok")
|
|
|
|
(print "4: vector nth...")
|
|
(let [ctx (init)]
|
|
(assert (= true (ct-eval ctx "(= :a (nth [:a :b :c :d] 0))")) "nth")
|
|
(assert (= true (ct-eval ctx "(= :c (nth [:a :b :c :d] 2 0.1))")) "nth float"))
|
|
(print " ok")
|
|
|
|
(print "5: range...")
|
|
(let [ctx (init)]
|
|
(assert (= true (ct-eval ctx "(= 0 (count (range 10 0 1)))")) "range empty")
|
|
(assert (= true (ct-eval ctx "(= 4 (count (range 0 10 3)))")) "range count")
|
|
(assert (= true (ct-eval ctx "(= 1 (count (range 0 1 1)))")) "range single"))
|
|
(print " ok")
|
|
|
|
(print "\nAll CLJS Collections Ported tests passed!")
|