type returns the JVM class (Clojure semantics) (#244)
(type x) was jolt's internal taxonomy keyword (:string/:set/:jolt/inst), which breaks any library dispatching a multimethod on [(type a) (type b)] against java/clojure.lang classes (e.g. clojure.tools.logging.test's matchers). Make the PUBLIC clojure.core/type Clojure's (or (:type meta) (class x)). The taxonomy keyword stays the core model: natives-meta.ss keeps jolt-type and exposes it as __type-tag, which print-method/print-dup dispatch on (so #uuid/#regex/ records still print). The JVM mapping lives in the java host layer — host-class.ss defines the public type next to (class …), and a jinst now reports java.util.Date (was :jolt/inst). So the core emits the taxonomy and the java layer remaps it in one place. unit.edn's type suite updated to the class names. make test green. Co-authored-by: Yogthos <yogthos@gmail.com>
This commit is contained in:
parent
6c03dffd00
commit
687dc60af6
8 changed files with 56 additions and 36 deletions
|
|
@ -65,6 +65,19 @@
|
|||
|
||||
(def-var! "clojure.core" "class" jolt-class)
|
||||
|
||||
;; The PUBLIC clojure.core/type — Clojure's (or (:type meta) (class x)). This is the
|
||||
;; java host layer's job: the core taxonomy (natives-meta.ss jolt-type, kept under
|
||||
;; __type-tag for print-method) is JVM-free, and the JVM class mapping lives HERE,
|
||||
;; next to (class …). The inst/array/byte-buffer host files extend `class` (a
|
||||
;; class-arm or jolt-type fallthrough) and re-point `type` at this same fn, so the
|
||||
;; remap of every value — :jolt/inst -> java.util.Date etc. — happens in one place.
|
||||
(define ty-meta-key (keyword #f "type"))
|
||||
(define (jolt-type-pub x)
|
||||
(let* ((m (jolt-meta x))
|
||||
(override (if (jolt-nil? m) jolt-nil (jolt-get m ty-meta-key jolt-nil))))
|
||||
(if (not (jolt-nil? override)) override (jolt-class x))))
|
||||
(def-var! "clojure.core" "type" jolt-type-pub)
|
||||
|
||||
;; bare class-name tokens -> canonical JVM class-name strings.
|
||||
(define class-token-alist
|
||||
'(("String" . "java.lang.String") ("Number" . "java.lang.Number")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue