host: ring-core enablement — java.net/util shims, protocol dispatch gaps, IReduceInit, spork/http bridge
The interop surface ring.util.codec needs (registered through the javatime shim registries): URLEncoder/URLDecoder (www-form-urlencoded in pure janet), Charset/forName, Base64 encoder/decoder, Integer/valueOf with radix + parseInt, StringTokenizer, clojure.lang.MapEntry (a 2-tuple), a String ctor from bytes, .getBytes on the String surface, and a java.lang.Number method surface (byteValue and friends). Protocol fixes: extend-protocol on java.util.Map/Set/List now dispatches (maps — phm/struct/sorted/records — never produced host tags and fell to Object), lazy seqs gained their ISeq tags, and a nil extension arm works (group-by-head and extend-type both choked on the nil head). reduce dispatches to a reified clojure.lang.IReduceInit's own reduce method, which is how ring-codec tokenizes. jolt-deps learns :deps/root (tools.deps monorepo subdirectory checkouts — ring-core lives inside ring-clojure/ring). spork/http, when jpm-installed, reaches the jolt layer as janet.spork.http/* through the janet.* bridge (soft: nothing requires it unless used). The protocol fixes alone let 29 more clojure-test-suite assertions execute: 5319 -> 5348 run, 4706 -> 4715 pass.
This commit is contained in:
parent
58f9a5e596
commit
7c26a182e8
6 changed files with 211 additions and 10 deletions
|
|
@ -252,8 +252,9 @@
|
|||
;; Group a flat seq that starts with a head symbol followed by its list specs
|
||||
;; into [[head spec spec ...] ...] runs. Used by extend-protocol and defrecord.
|
||||
(defn- group-by-head [items]
|
||||
;; nil is a valid extension head (extend-protocol P ... nil (m [x] ...)).
|
||||
(reduce (fn [acc x]
|
||||
(if (symbol? x)
|
||||
(if (or (symbol? x) (nil? x))
|
||||
(conj acc [x])
|
||||
(conj (pop acc) (conj (peek acc) x))))
|
||||
[] items))
|
||||
|
|
@ -347,9 +348,10 @@
|
|||
|
||||
(defmacro extend-type [tsym psym & impls]
|
||||
;; register-method is a fn (clojure.core); pass type/protocol/method NAMES as
|
||||
;; strings (not the symbols) so the call compiles as a plain invoke.
|
||||
;; strings (not the symbols) so the call compiles as a plain invoke. A nil
|
||||
;; type extends on nil values (the host tag is the string "nil").
|
||||
`(do ~@(map (fn [spec]
|
||||
`(register-method ~(name tsym) ~(name psym) ~(name (first spec))
|
||||
`(register-method ~(if (nil? tsym) "nil" (name tsym)) ~(name psym) ~(name (first spec))
|
||||
(fn* ~(nth spec 1) ~@(drop 2 spec))))
|
||||
impls)))
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue