Chez Phase 3 inc 2: quote + collection literals in jolt.backend-scheme
Adds :vector/:map/:set (emit-ordered, left-to-right element eval) and :quote to
the portable Clojure emitter. Collection-literal nodes carry already-analyzed IR
items so they just recurse; quote walks the RAW reader form.
emit-quoted walks the reader form via the jolt.host form-* contract (form-list?/
form-elements/form-vec-items/form-map-pairs/form-set-items/form-sym-*), the same
portable seam the analyzer uses — not host-native predicates, so it works
unchanged whether the form came from the Janet reader or the Chez reader. Reader
forms are raw host representations (Janet list=array, vec=tuple), so native
list?/vector? would not see them; the contract is the correct abstraction and
keeps the emitter host-neutral. Quoted-symbol metadata and def-meta still defer
to inc 3.
Surfaced a latent Janet-host bug (jolt-tg9s): (quote #{...}) evaluates to the raw
reader form instead of a reconstructed set, so (contains? (quote #{:p :q}) :p) is
false on build/jolt. The Chez emitter is correct (real Clojure: true); the parity
test asserts the verified value for those two cases.
Gate: emit-parity 42/42 (incl vector/map/set literals, coll/kw-as-fn, quoted
list/vec/map/set/symbol/nested). emit-test 331/331, conformance 355x3. jolt-7jvp.
This commit is contained in:
parent
d6847b3ba4
commit
206fe94a95
2 changed files with 106 additions and 9 deletions
|
|
@ -88,11 +88,26 @@
|
|||
[code (string/trim out) (string/trim err)])
|
||||
|
||||
# A case passes when the Clojure emitter's Chez output equals the Janet oracle.
|
||||
# An emit-time throw (out-of-subset op) is a clean FAIL, not a crash.
|
||||
(defn check [name src]
|
||||
(def want (cli-oracle src))
|
||||
(def [code out err] (run-clj src))
|
||||
(ok name (and (= code 0) (= out want))
|
||||
(string "chez=" out " oracle=" want " code=" code " | " err)))
|
||||
(def res (protect (run-clj src)))
|
||||
(if (not (res 0))
|
||||
(ok name false (string "emit/run threw: " (res 1)))
|
||||
(let [[code out err] (res 1)]
|
||||
(ok name (and (= code 0) (= out want))
|
||||
(string "chez=" out " oracle=" want " code=" code " | " err)))))
|
||||
|
||||
# For cases where the Janet oracle carries a known latent bug (e.g. quoted-set
|
||||
# literals don't reconstruct, jolt-tg9s) but Chez is correct: assert Chez output
|
||||
# against the hand-verified real-Clojure value directly.
|
||||
(defn check-exact [name src want]
|
||||
(def res (protect (run-clj src)))
|
||||
(if (not (res 0))
|
||||
(ok name false (string "emit/run threw: " (res 1)))
|
||||
(let [[code out err] (res 1)]
|
||||
(ok name (and (= code 0) (= out want))
|
||||
(string "chez=" out " want=" want " code=" code " | " err)))))
|
||||
|
||||
# --- inc 1 subset: const/local/var/if/do/let/loop/recur/invoke/fn/def ----------
|
||||
|
||||
|
|
@ -113,6 +128,35 @@
|
|||
(check "truthy local" "(defn t [x] (if x 1 2)) (t false)")
|
||||
(check "mod rem quot" "(+ (mod 17 5) (rem 17 5) (quot 17 5))")
|
||||
(check "min max" "(+ (min 3 1 2) (max 3 1 2))")
|
||||
# --- inc 2 subset: collection literals (vector/map/set) + quote -----------------
|
||||
|
||||
(check "vector literal" "[1 2 3]")
|
||||
(check "nested vector" "[1 [2 3] [4 [5 6]]]")
|
||||
(check "vector of exprs" "[(+ 1 2) (* 3 4)]")
|
||||
(check "map literal eq" "(= {:a 1 :b 2} {:a 1 :b 2})")
|
||||
(check "map get" "(get {:a 1 :b 2} :b)")
|
||||
(check "set literal eq" "(= #{1 2 3} #{3 2 1})")
|
||||
(check "set contains" "(contains? #{1 2 3} 2)")
|
||||
(check "vector count" "(count [10 20 30 40])")
|
||||
(check "conj vector" "(conj [1 2] 3 4)")
|
||||
(check "assoc map" "(get (assoc {:a 1} :b 2) :b)")
|
||||
(check "coll as fn" "({:a 1 :b 2} :a)")
|
||||
(check "kw as fn" "(:b {:a 1 :b 2})")
|
||||
(check "kw as fn default" "(:z {:a 1} 99)")
|
||||
(check "quote list" "(count (quote (a b c d)))")
|
||||
(check "quote vector eq" "(= (quote [1 2 3]) [1 2 3])")
|
||||
(check "quote symbol eq" "(= (quote foo) (quote foo))")
|
||||
(check "quote ns symbol eq" "(= (quote my.ns/bar) (quote my.ns/bar))")
|
||||
(check "quote nested count" "(count (quote (a [1 2] {:k v})))")
|
||||
(check "quote keyword in list" "(first (quote (:a :b :c)))")
|
||||
(check "quote map" "(get (quote {:x 1 :y 2}) :y)")
|
||||
# Janet oracle is buggy here (jolt-tg9s): quoted-set doesn't reconstruct. Chez is
|
||||
# correct (real Clojure: true) — assert against the verified value.
|
||||
(check-exact "quote set contains" "(contains? (quote #{:p :q}) :p)" "true")
|
||||
(check-exact "quote set eq literal" "(= (quote #{1 2 3}) #{1 2 3})" "true")
|
||||
(check "vector map filter" "(into [] (filter even? (map inc [1 2 3 4 5])))")
|
||||
(check "map over literal" "(reduce + (vals {:a 1 :b 2 :c 3}))")
|
||||
|
||||
(check "mandelbrot run(20)"
|
||||
(string ``
|
||||
(defn count-point [cr ci cap]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue