Reimplement the ctx-coupled seed ns natives over the rt.ss var-table, since Chez has no ctx. host/chez/ns.ss adds a jns namespace value + a registry and binds find-ns/the-ns/create-ns/in-ns/all-ns/ns-publics/ns-map/ns-interns/ ns-aliases/resolve/find-var/ns-unmap/*ns* into clojure.core. The resolve friction: native-ops (+, map, …) are inlined at emit so they have no var-cell, and (resolve '+) was nil — diverging from Clojure where it's a var. Added a defined? flag to the var-cell record (set by def-var!/declare-var!, left false on a lazily-materialised forward ref) and def-var!'d every native-op name to its value-position proc, so resolve returns the cell iff genuinely defined. ns-unmap clears the flag. resolve never interns an empty cell (var-cell-lookup is non-creating). ns-name is overridden natively in post-prelude (the overlay reads (get ns :name), nil on a jns record); the printers render a namespace as its name. *ns* binds to the user ns; in-ns re-binds it. use/require cross-ns switching stays deferred to Phase 3 (the analyzer bakes a def's target ns at compile time). Prelude parity 1951 -> 1969, 0 new divergences; four now-passing allowlist entries dropped (ns *ns* cases + str-of-a-var). New focused gate test/chez/ _ns.janet (19 cases, expectations from the JVM-canonical build/jolt).
33 lines
2 KiB
Scheme
33 lines
2 KiB
Scheme
;; post-prelude overrides (jolt-9ziu) — loaded AFTER the assembled clojure.core
|
|
;; prelude, so these win over the overlay's own def-var!.
|
|
;;
|
|
;; A few clojure.core predicates are implemented in the overlay by inspecting a
|
|
;; Janet-host tagged value's :jolt/type key (e.g. (get x :jolt/type)). That key
|
|
;; doesn't exist for Chez-native representations: a jolt char is a Scheme char,
|
|
;; an atom is a Chez record. The overlay's def-var! loads after rt.ss, so it
|
|
;; clobbers the correct native shims (predicates.ss / atoms.ss) with versions
|
|
;; that return false on every Chez value. Re-assert the native versions here.
|
|
;;
|
|
;; (Long-term these predicates want a host-neutral implementation that calls a
|
|
;; host primitive instead of reading :jolt/type; until then this is the Chez-host
|
|
;; override.)
|
|
(def-var! "clojure.core" "char?" jolt-char-pred?)
|
|
(def-var! "clojure.core" "atom?" jolt-atom?)
|
|
;; volatiles: a Chez volatile is a jvol record, but the overlay vreset!/vswap!/
|
|
;; volatile? drive it via jolt.host/ref-put!+get / :jolt/type (tagged-table only).
|
|
;; Override with the native versions (defined in natives-xform.ss).
|
|
(def-var! "clojure.core" "vreset!" jolt-vreset!)
|
|
(def-var! "clojure.core" "vswap!" jolt-vswap!)
|
|
(def-var! "clojure.core" "volatile?" jolt-volatile-pred?)
|
|
;; bound?: the overlay reads (get v :root) — nil on a Chez var-cell record, so it
|
|
;; would wrongly report every var unbound. Native version (defined in vars.ss).
|
|
(def-var! "clojure.core" "bound?" jolt-bound?)
|
|
;; uuid?/random-uuid/parse-uuid/tagged-literal? are overlay (read :jolt/type or
|
|
;; build tagged tables) — re-assert the native versions (defined in natives-misc.ss).
|
|
(def-var! "clojure.core" "uuid?" jolt-uuid-pred?)
|
|
(def-var! "clojure.core" "random-uuid" jolt-random-uuid)
|
|
(def-var! "clojure.core" "parse-uuid" jolt-parse-uuid)
|
|
(def-var! "clojure.core" "tagged-literal?" jolt-tagged-literal-pred?)
|
|
;; ns-name: the overlay reads (get ns :name) — nil on a jns namespace record.
|
|
;; Native version (defined in ns.ss) returns the namespace's name symbol.
|
|
(def-var! "clojure.core" "ns-name" jolt-ns-name)
|