* core: fix jolt-265 — syntax-quote fully-qualifies core syms to clojure.core/ Re-attempt of the deferred gap, now unblocked. The earlier uberscript break wasn't qualification itself but an aliased-ref resolution bug it exposed: resolve-var looked up ns-aliases (e.g. g/foo) against the analyzer's REBOUND ctx-current-ns (jolt.analyzer, since the analyzer runs interpreted in its own ns) instead of the namespace being compiled. A user's aliased refs failed mid-compile (g/hello -> nil in the bundled standalone). - resolve-var resolves aliases against :compile-ns when set (same ns h-current-ns uses), falling back to ctx-current-ns — correct for both modes. - sq-symbol qualifies a resolved clojure.core name to clojure.core/<name> (Clojure hygiene); special forms stay bare; unresolved syms -> current ns. Tests updated to the qualified behavior (features-test, reader-forms-spec). * test: comprehensive spec — regex + sorted colls + random/predicate gaps Filling the biggest untested clojure.core areas found in a coverage audit (168 of 506 provided fns had no spec). New + expanded suites: - regex-spec.janet (20): #"…" literals, regex?, re-find/re-matches/re-seq (match/no-match/groups), re-pattern, and clojure.string split/replace with regex (incl $1 backrefs). Whole area was previously unspecced. - sorted-spec.janet (14): sorted-map/sorted-set construction + ordering, sorted?, subseq/rsubseq. Pins the working subset — get/conj/assoc/keys/vals on sorted colls and the by-comparator ctors are not yet first-class (jolt-ti9). - predicates-spec +14: seqable?, integer?, reduced?/unreduced, not-empty. - numbers-spec +5: rand/rand-int/rand-nth invariants. Fix: sorted? was bound to core-sorted-map? so it returned false for sorted-sets; now true for both sorted maps and sets (core-sorted?). Filed: jolt-ti9 (sorted collections incomplete: get/conj/assoc/keys/vals don't operate on the sorted wrapper; sorted-*-by ignore the comparator). Gate green incl full jpm build + jpm test. * core: close surfaced gaps — first-class sorted colls, with-out-str, rand arity, deref reduced jolt-ti9: sorted-map/sorted-set are now first-class across the collection fns — get/assoc/dissoc/conj/contains?/keys/vals/disj and call-as-fn all operate on the wrapper and preserve sort order. The by-comparator constructors (sorted-map-by/ sorted-set-by) now thread the user comparator (numeric or boolean-predicate) through all derived colls. Sorted predicates/ctors/ops moved above core-conj so the collection fns can branch on them; jolt-invoke (interpreter) gets inline branches. jolt-rfw: add with-out-str (binds output to a string buffer) + the macro. jolt-ek3: (rand n) arity and deref-of-reduced (uuid? still deferred). Specs: new io-spec.janet; sorted-spec expanded to pin the now-working map/set ops and by-comparator ordering; predicate/number spec restorations. * remove old doc * core: fix stale comment — by-comparator sorted ctors are implemented --------- Co-authored-by: Yogthos <yogthos@gmail.com>
59 lines
3.5 KiB
Text
59 lines
3.5 KiB
Text
# Specification: sorted collections (sorted-map / sorted-set, subseq/rsubseq).
|
|
#
|
|
# sorted collections are first-class for the core ops (jolt-ti9): get/assoc/dissoc/
|
|
# conj/contains?/keys/vals/disj all work and preserve sort order, and a sorted coll
|
|
# is callable as a key-lookup fn. STILL TODO: the by-comparator constructors
|
|
# (sorted-map-by / sorted-set-by) ignore the supplied comparator (jolt-ti9). (vec
|
|
# coerces a seq to a vector so expecteds are vector literals, not quoted lists.)
|
|
(use ../support/harness)
|
|
|
|
(defspec "sorted / construction & ordering"
|
|
["sorted-set orders" "[1 2 3]" "(vec (seq (sorted-set 3 1 2)))"]
|
|
["sorted-set dedupes" "[1 2 3]" "(vec (seq (sorted-set 3 1 2 1 3)))"]
|
|
["sorted-set numeric" "[1 2 10]" "(vec (seq (sorted-set 10 1 2)))"]
|
|
["sorted-map ordered entries" "[[:a 1] [:b 2] [:c 3]]" "(vec (seq (sorted-map :c 3 :a 1 :b 2)))"]
|
|
["first is min" "1" "(first (sorted-set 5 3 9 1))"])
|
|
|
|
(defspec "sorted / sorted?"
|
|
["sorted-set" "true" "(sorted? (sorted-set 1))"]
|
|
["sorted-map" "true" "(sorted? (sorted-map :a 1))"]
|
|
["plain set" "false" "(sorted? #{1})"]
|
|
["plain map" "false" "(sorted? {:a 1})"]
|
|
["vector" "false" "(sorted? [1 2])"])
|
|
|
|
(defspec "sorted / map ops"
|
|
["get hit" "2" "(get (sorted-map :a 1 :b 2) :b)"]
|
|
["get miss default" ":none" "(get (sorted-map :a 1) :z :none)"]
|
|
["contains? yes" "true" "(contains? (sorted-map :a 1) :a)"]
|
|
["contains? no" "false" "(contains? (sorted-map :a 1) :z)"]
|
|
["assoc keeps order" "[[:a 1] [:b 2] [:c 3]]" "(vec (seq (assoc (sorted-map :c 3 :a 1) :b 2)))"]
|
|
["dissoc" "[[:a 1] [:c 3]]" "(vec (seq (dissoc (sorted-map :a 1 :b 2 :c 3) :b)))"]
|
|
["conj entry" "[[:a 1] [:z 9]]" "(vec (seq (conj (sorted-map :a 1) [:z 9])))"]
|
|
["keys sorted" "[:a :b :c]" "(vec (keys (sorted-map :c 3 :a 1 :b 2)))"]
|
|
["vals by key" "[1 2 3]" "(vec (vals (sorted-map :c 3 :a 1 :b 2)))"]
|
|
["map as fn" "2" "((sorted-map :a 1 :b 2) :b)"]
|
|
["map as fn miss" ":d" "((sorted-map :a 1) :z :d)"])
|
|
|
|
(defspec "sorted / set ops"
|
|
["get present" "2" "(get (sorted-set 1 2 3) 2)"]
|
|
["get absent" ":none" "(get (sorted-set 1 2 3) 9 :none)"]
|
|
["contains? yes" "true" "(contains? (sorted-set 1 2 3) 2)"]
|
|
["contains? no" "false" "(contains? (sorted-set 1 2 3) 9)"]
|
|
["conj keeps order" "[0 1 2 3 5]" "(vec (seq (conj (sorted-set 1 2 3) 5 0)))"]
|
|
["disj" "[1 3]" "(vec (seq (disj (sorted-set 1 2 3) 2)))"]
|
|
["set as fn" "3" "((sorted-set 1 2 3) 3)"]
|
|
["set as fn miss" "nil" "((sorted-set 1 2 3) 9)"])
|
|
|
|
(defspec "sorted / by comparator"
|
|
["sorted-set-by desc" "[10 3 2 1]" "(vec (seq (sorted-set-by > 1 3 2 10)))"]
|
|
["sorted-map-by desc" "[[3 :c] [2 :b] [1 :a]]" "(vec (seq (sorted-map-by > 1 :a 3 :c 2 :b)))"]
|
|
["conj keeps comparator" "[5 3 2 1 0]" "(vec (seq (conj (sorted-set-by > 1 3 2) 5 0)))"]
|
|
["assoc keeps comparator" "[3 2 1]" "(vec (keys (assoc (sorted-map-by > 1 :a 3 :c) 2 :b)))"]
|
|
["disj keeps comparator" "[3 1]" "(vec (seq (disj (sorted-set-by > 1 2 3) 2)))"]
|
|
["by-comparator is sorted?" "true" "(sorted? (sorted-set-by > 1 2))"])
|
|
|
|
(defspec "sorted / subseq & rsubseq"
|
|
["subseq >=" "[3 4 5]" "(vec (subseq (sorted-set 1 2 3 4 5) >= 3))"]
|
|
["subseq <" "[1 2]" "(vec (subseq (sorted-set 1 2 3 4 5) < 3))"]
|
|
["subseq range" "[2 3 4]" "(vec (subseq (sorted-set 1 2 3 4 5) > 1 < 5))"]
|
|
["rsubseq <=" "[3 2 1]" "(vec (rsubseq (sorted-set 1 2 3 4 5) <= 3))"])
|