Rename src/jolt -> stdlib (the runtime-loaded layer; jolt-core stays the seed-baked layer) and update the loader / emit-image / doc paths. Drop dead code: the spike/ experiments, the duplicate clojuredocs-export.edn (json moves to tools/), the Janet-era jolt.http binding, and the orphaned persistent_vector.clj whose ns/path didn't even match. Strip porting residue from comments and docstrings across host/chez, jolt-core, stdlib, tests, and docs: internal issue ids, "Phase N" markers, and the "vs Janet" historical exposition, leaving present-tense descriptions and the real JVM-Clojure semantic contrasts. Same pass over the corpus suite labels. The seed is unchanged (docstrings/comments aren't emitted), so the self-host fixpoint and corpus are untouched. Port tools/spec_coverage.py off the dead janet probe to bin/joltc and regenerate coverage.md; drop the dead :host/janet rule from certify.clj and regenerate the conformance profile. Add docs/host-interop.md (the JVM shims and how to register your own host class from a library) and a writing-style note in CLAUDE.md. Stabilize the four racy concurrency corpus cases (future-cancel and agent send/send-off): give the future a sleeping body and the agent a slow action, so cancel reliably catches an in-flight future and deref reliably reads the pre-update snapshot. They certify deterministically now, so drop their :flaky allowlist entries and the orphaned legend.
52 lines
1.7 KiB
Clojure
52 lines
1.7 KiB
Clojure
; Jolt Standard Library: clojure.walk
|
|
; Tree walking for Clojure data structures.
|
|
|
|
(defn walk
|
|
[inner outer form]
|
|
(cond
|
|
; vectors/maps first so seq? can't swallow them (a vector is not seq? on
|
|
; jolt, but keep the concrete branches authoritative)
|
|
(vector? form) (outer (vec (map inner form)))
|
|
(map? form) (outer (into (empty form) (map inner form)))
|
|
; lists rebuild as lists, other seqs (incl. macro/template output: cons/
|
|
; concat/lazy-seq) walk too — without this, postwalk-replace silently no-op'd
|
|
; a quoted list, breaking clojure.template/apply-template
|
|
(list? form) (outer (apply list (map inner form)))
|
|
(seq? form) (outer (map inner form))
|
|
:else (outer form)))
|
|
|
|
(defn postwalk
|
|
[f form]
|
|
(walk (partial postwalk f) f form))
|
|
|
|
(defn prewalk
|
|
[f form]
|
|
(walk (partial prewalk f) identity (f form)))
|
|
|
|
(defn postwalk-demo
|
|
"Demonstrates the behavior of postwalk by printing each form as it is walked."
|
|
[form]
|
|
(postwalk (fn [x] (print "Walked: ") (prn x) x) form))
|
|
|
|
(defn prewalk-demo
|
|
"Demonstrates the behavior of prewalk by printing each form as it is walked."
|
|
[form]
|
|
(prewalk (fn [x] (print "Walked: ") (prn x) x) form))
|
|
|
|
(defn postwalk-replace
|
|
[smap form]
|
|
(postwalk (fn [x] (if (contains? smap x) (get smap x) x)) form))
|
|
|
|
(defn prewalk-replace
|
|
[smap form]
|
|
(prewalk (fn [x] (if (contains? smap x) (get smap x) x)) form))
|
|
|
|
(defn keywordize-keys
|
|
[m]
|
|
(let [f (fn [[k v]] (if (string? k) [(keyword k) v] [k v]))]
|
|
(postwalk (fn [x] (if (map? x) (into {} (map f x)) x)) m)))
|
|
|
|
(defn stringify-keys
|
|
[m]
|
|
(let [f (fn [[k v]] (if (keyword? k) [(name k) v] [k v]))]
|
|
(postwalk (fn [x] (if (map? x) (into {} (map f x)) x)) m)))
|