refactor: registry pattern for jolt-pr-str/pr-readable + remaining arms (jolt-lmot)
The printer's two entry points (jolt-pr-str in rt.ss, jolt-pr-readable in printing.ss) get register-pr-str-arm! / register-pr-readable-arm!, plus register-pr-arm! for the types whose str and readable forms match (bigdec/inst/uuid/tagged/record/ns/var). The normalize arms (sorted, lazy-seq, queue) and the uri readable arm register per-printer. Also folds in the hash (dyn-binding var-cell), class (io uri/uuid/file), and get (transients) arms missed earlier. natives-array's get stays a case-lambda wrapper on purpose: its 2-arg path errors on an out-of-bounds index while the 3-arg path returns the default, an arity distinction the (coll k d) registry collapses — left as-is to preserve behaviour. Completes jolt-lmot: all six dispatchers (hash/class/get/=/pr-str/pr-readable) off the set!-rebind chains. make test green, 0 new corpus divergences; pr-str/str of inst, uuid, bigdec, sorted-map, record-with-lazyseq, queue all verified.
This commit is contained in:
parent
acf3e1ffd3
commit
9a21325972
14 changed files with 48 additions and 64 deletions
|
|
@ -179,7 +179,13 @@
|
|||
;; bare nil renders as the empty string (a nil ELEMENT inside a collection still
|
||||
;; prints "nil", which jolt-pr-str handles).
|
||||
(define (jolt-final-str x) (if (jolt-nil? x) "" (jolt-pr-str x)))
|
||||
(define (jolt-pr-str x)
|
||||
;; A host shim registers a type's str-style rendering via register-pr-str-arm! (or
|
||||
;; register-pr-arm! in printing.ss for both printers at once) instead of
|
||||
;; set!-wrapping jolt-pr-str. Disjoint types, checked before the base cases.
|
||||
(define jolt-pr-str-arms '())
|
||||
(define (register-pr-str-arm! pred render)
|
||||
(set! jolt-pr-str-arms (cons (cons pred render) jolt-pr-str-arms)))
|
||||
(define (jolt-pr-str-base x)
|
||||
(cond
|
||||
((jolt-nil? x) "nil")
|
||||
((eq? x #t) "true")
|
||||
|
|
@ -206,6 +212,11 @@
|
|||
(if (jolt-nil? s) (reverse acc)
|
||||
(loop (jolt-seq (seq-more s)) (cons (jolt-pr-str (seq-first s)) acc))))) ")"))
|
||||
(else (format "~a" x))))
|
||||
(define (jolt-pr-str x)
|
||||
(let loop ((as jolt-pr-str-arms))
|
||||
(cond ((null? as) (jolt-pr-str-base x))
|
||||
(((caar as) x) ((cdar as) x))
|
||||
(else (loop (cdr as))))))
|
||||
|
||||
;; converters + string ops: str/subs/vec/keyword/symbol/compare/int/
|
||||
;; double/gensym — host-coupled seed natives def-var!'d into clojure.core. Loaded
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue