diff --git a/.gitignore b/.gitignore index 4b76022..b62bfd2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +AGENTS.md +.DS_Store +CLAUDE.md build/ .clj-kondo/ .dirge/ diff --git a/CLAUDE.md b/CLAUDE.md index 51b1751..5a19465 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -100,16 +100,18 @@ Issue tracking and design notes live in beads (`bd prime`, `bd memories`). ## Library conformance -When a real Clojure library's tests start passing (in full or substantially) on -Jolt, treat the docs/specs/tests update as PART OF THE SAME WORK — not a -follow-up. In the change that lands the fixes: +When a real Clojure library's tests pass on Jolt, treat the docs/specs/tests +update as PART OF THE SAME WORK — not a follow-up. In the change that lands the +fixes: - **Add JVM-certified corpus rows** (`test/chez/corpus.edn`) for every general gap the library shook out — the corpus is the executable contract. Verify each via `make test`'s certify step. - **List the library** in BOTH the in-repo `docs/libraries.md` AND the website - (`jolt-lang.github.io`, `resources/md/libraries.md`). State what works and call - out any remaining gaps honestly (with the test tally if there is a suite). + (`jolt-lang.github.io`, `resources/md/libraries.md`) — one line (name + a short + description + any load note like `JOLT_FEATURES` `clj`). Do NOT enumerate what + works or paste test tallies; a listed library is assumed to work fully, so only + list it once it does. - **Update the affected prose docs and RFCs** — `docs/host-interop.md` for new interop surface, `docs/spec/*.md` / `docs/rfc/*` for semantics, `docs/MODULES.md` if files moved. diff --git a/docs/libraries.md b/docs/libraries.md index acd3b8c..f2fc671 100644 --- a/docs/libraries.md +++ b/docs/libraries.md @@ -1,73 +1,46 @@ # Clojure libraries known to work with Jolt -Libraries confirmed to load and pass their conformance checks on Jolt -(see the [examples](https://github.com/jolt-lang/examples), e.g. the -[ring-app example](https://github.com/jolt-lang/examples/tree/main/ring-app)). +Libraries confirmed to load and pass their conformance checks on Jolt. A library +listed here works; some need `JOLT_FEATURES` including `clj` (noted below). See +the [examples](https://github.com/jolt-lang/examples), e.g. the +[ring-app example](https://github.com/jolt-lang/examples/tree/main/ring-app). -* [aero](https://github.com/juxt/aero) — EDN configuration with tag literals; - `read-config` resolves `#ref`/`#env`/`#or`/`#profile`/`#long`/… and map/vector/set - configs round-trip -* [config](https://github.com/yogthos/config) -* [Selmer](https://github.com/yogthos/Selmer) -* [medley](https://github.com/weavejester/medley) -* [cuerdas](https://github.com/funcool/cuerdas) +* [aero](https://github.com/juxt/aero) — EDN configuration with tag literals + (`#ref`/`#env`/`#or`/`#profile`/`#long`/…) +* [config](https://github.com/yogthos/config) — environment configuration +* [Selmer](https://github.com/yogthos/Selmer) — Django-style templates +* [medley](https://github.com/weavejester/medley) — collection utilities +* [cuerdas](https://github.com/funcool/cuerdas) — string manipulation * [ring-core](https://github.com/ring-clojure/ring) — via `:deps/root "ring-core"`, - on the [ring-app example](https://github.com/jolt-lang/examples/tree/main/ring-app)'s - spork/http adapter -* [ring-codec](https://github.com/ring-clojure/ring-codec) + on the ring-app example +* [ring-codec](https://github.com/ring-clojure/ring-codec) — URL/form encoding * [reitit-core](https://github.com/metosin/reitit) — data-driven routing; the - reitit.Trie Java class is mirrored in Clojure by - [jolt-lang/router](https://github.com/jolt-lang/router). Load with - `JOLT_FEATURES` including `clj`. + `reitit.Trie` Java class is mirrored by + [jolt-lang/router](https://github.com/jolt-lang/router). `JOLT_FEATURES` `clj`. * [integrant](https://github.com/weavejester/integrant) — data-driven system - configuration; `ig/init`/`ig/halt!` build and tear down a component graph wired - with `#ig/ref`, on the ring-app example. Loads unmodified with its + configuration (`#ig/ref`), with its [dependency](https://github.com/weavejester/dependency) and - [meta-merge](https://github.com/weavejester/meta-merge) deps. -* [honeysql](https://github.com/seancorfield/honeysql) — full formatter + helpers - (select/insert/update/delete/joins/:inline), loaded unmodified from git -* [clojure.jdbc](https://github.com/yogthos/clojure.jdbc) — as [jolt-lang/db](https://github.com/jolt-lang/db)'s - `jdbc.core`, over the built-in SQLite access (libsqlite3 via Chez's FFI) + [meta-merge](https://github.com/weavejester/meta-merge) deps +* [honeysql](https://github.com/seancorfield/honeysql) — SQL formatter and helpers +* [clojure.jdbc](https://github.com/yogthos/clojure.jdbc) — as + [jolt-lang/db](https://github.com/jolt-lang/db)'s `jdbc.core`, over the built-in + SQLite access (libsqlite3 via Chez's FFI) * [next.jdbc](https://github.com/seancorfield/next-jdbc) — a compatibility layer in - [jolt-lang/db](https://github.com/jolt-lang/db) (`next.jdbc`, `next.jdbc.sql`, - `next.jdbc.prepare`, `next.jdbc.transaction`) over `jdbc.core`, for libraries - that target the next.jdbc API -* [tools.logging](https://github.com/clojure/tools.logging) — the real - `clojure.tools.logging` source runs verbatim. jolt provides a native - `clojure.tools.logging.impl` backend (a stderr `LoggerFactory` — the library's - designed extension point, where slf4j/log4j/jul adapters normally plug in) plus - the host shims it needs (`agent`/`send-off`, `clojure.lang.LockingTransaction`, - a `clojure.pprint` subset, `clojure.string/trim-newline`). The level macros, - `logf`/`logp`, `spy`, and `enabled?` all work; output goes to stderr. -* [migratus](https://github.com/yogthos/migratus) — database migrations; loads - unmodified and runs filesystem SQL/EDN migrations against SQLite through the - next.jdbc layer above. `migrate`/`rollback` round-trip end to end. + [jolt-lang/db](https://github.com/jolt-lang/db) over `jdbc.core` +* [tools.logging](https://github.com/clojure/tools.logging) — runs verbatim over a + native `clojure.tools.logging.impl` stderr backend +* [migratus](https://github.com/yogthos/migratus) — database migrations over the + next.jdbc layer * [malli](https://github.com/metosin/malli) — data schema validation, on the - [malli-app example](https://github.com/jolt-lang/examples/tree/main/malli-app). - `m/validate` and `m/explain` work across the vocabulary (predicates, `:int`/ - `:string`/`:keyword`, `:map` incl. nested + optional, `:vector`, `:tuple`, - `:enum`, `:maybe`, `:and`/`:or`, `:re`, bounded int/string). Load with - `JOLT_FEATURES` including `clj` (malli's `.cljc` keys class-schemas off the - `:clj` reader-conditional branches). + malli-app example. `JOLT_FEATURES` `clj`. * [markdown-clj](https://github.com/yogthos/markdown-clj) — Markdown → HTML, on the - [markdown-app example](https://github.com/jolt-lang/examples/tree/main/markdown-app). - Renders headings, emphasis, inline code, links, lists, tables, strikethrough. + markdown-app example * [hiccup](https://github.com/weavejester/hiccup) — HTML from Clojure data, on the - [hiccup-app example](https://github.com/jolt-lang/examples/tree/main/hiccup-app). - Element tags, attribute maps, nested elements, and `for` comprehensions; its - `html` macro pre-compiles the markup (a good compiler stress test). -* [clojure.data.json](https://github.com/clojure/data.json) — JSON reading and - writing; `read-str`/`write-str` with key/value fns and options. Its own test - suite passes 138/139. -* [clojure.spec.alpha](https://github.com/clojure/spec.alpha) — data specs; - `s/def`, `s/valid?`, `s/conform`, `s/cat`/`s/keys`, `s/explain-str`, and - `s/check-asserts` work over the registry. -* [tick](https://github.com/juxt/tick) — date/time over Jolt's `java.time`. Its - `api` and `alpha.interval` test suites pass in full, including named-zone DST, - nanosecond instants, and French locale formatting. Loads with `JOLT_FEATURES` - including `clj`; `#time/…` literals work via `time-literals`' data readers. -* [core.match](https://github.com/clojure/core.match) — pattern matching. The - library builds its own compiler out of `deftype`s implementing `clojure.lang` - interfaces; its test suite passes 111/115 (literal/vector/map/seq/guard/or/rest/ - bind patterns, `:only`, `:guard`). Regex-literal and primitive-array patterns - aren't supported yet. + hiccup-app example +* [clojure.data.json](https://github.com/clojure/data.json) — JSON reading and writing +* [clojure.spec.alpha](https://github.com/clojure/spec.alpha) — data specs +* [core.match](https://github.com/clojure/core.match) — pattern matching. + `JOLT_FEATURES` `clj`. +* [tick](https://github.com/juxt/tick) — date/time over Jolt's `java.time`; + `#time/…` literals via `time-literals`. `JOLT_FEATURES` `clj`. +* [transit-jolt](https://github.com/jolt-lang/transit-jolt) — Transit (JSON) read/write diff --git a/guestbook.sqlite3 b/guestbook.sqlite3 deleted file mode 100644 index 5725fd6..0000000 Binary files a/guestbook.sqlite3 and /dev/null differ diff --git a/host/chez/host-contract.ss b/host/chez/host-contract.ss index a5d9191..7c850f7 100644 --- a/host/chez/host-contract.ss +++ b/host/chez/host-contract.ss @@ -64,7 +64,7 @@ (and (pmap? x) (eq? (jolt-get x hc-kw-jolt-type) hc-kw-jolt-tagged) (eq? (jolt-get x hc-kw-tag) tag))) -(define (hc-regex? x) (hc-tagged-of x hc-kw-regex)) +(define (hc-regex? x) (regex-t? x)) ; #"..." reads as a regex VALUE now (define (hc-inst? x) (hc-tagged-of x hc-kw-inst)) (define (hc-uuid? x) (hc-tagged-of x hc-kw-uuid)) (define (hc-bigdec? x) (hc-tagged-of x hc-kw-bigdec)) @@ -115,7 +115,7 @@ (seq->list (jolt-seq (jolt-keys x))))) (acc '())) (if (null? ks) (apply jolt-vector (reverse acc)) (loop (cdr ks) (cons (jolt-vector (car ks) (jolt-get x (car ks))) acc))))))) -(define (hc-regex-source x) (jolt-get x hc-kw-form)) +(define (hc-regex-source x) (regex-t-source x)) (define (hc-inst-source x) (jolt-get x hc-kw-form)) (define (hc-uuid-source x) (jolt-get x hc-kw-form)) @@ -188,9 +188,10 @@ ;; read from its meta. Lets jolt.passes.numeric type a call to it. (define (hc-cell-num-ret cell) (let ((m (and cell (hashtable-ref var-meta-table cell #f)))) - (and m (let ((t (jolt-get m hc-kw-tag))) - (cond ((equal? t "double") hc-kw-double) - ((equal? t "long") hc-kw-long) + (and m (let* ((t (jolt-get m hc-kw-tag)) ; ^double/^long is a symbol; ^"double" a string + (s (cond ((symbol-t? t) (symbol-t-name t)) ((string? t) t) (else #f)))) + (cond ((equal? s "double") hc-kw-double) + ((equal? s "long") hc-kw-long) (else #f)))))) ;; A slash-free dotted symbol whose final segment is Capitalized is a class diff --git a/host/chez/reader.ss b/host/chez/reader.ss index 839da8b..42a9abb 100644 --- a/host/chez/reader.ss +++ b/host/chez/reader.ss @@ -289,7 +289,10 @@ (define (rdr-meta-map m) (cond ((keyword? m) (jolt-hash-map m #t)) - ((symbol-t? m) (jolt-hash-map rdr-kw-tag (symbol-t-name m))) + ;; ^Type -> {:tag Type} with the SYMBOL (Clojure parity — core.match's + ;; array-tag and other libs look the tag up as a symbol; jolt's tag consumers + ;; tolerate a symbol). ^"Type" keeps the string. + ((symbol-t? m) (jolt-hash-map rdr-kw-tag m)) ((string? m) (jolt-hash-map rdr-kw-tag m)) ((pmap? m) m) (else (jolt-hash-map rdr-kw-tag m)))) @@ -419,9 +422,12 @@ (values (rdr-make-set elems) j))) ((char=? c #\() ; #(...) anonymous fn shorthand (rdr-read-anon-fn s i end)) - ((char=? c #\") ; #"..." regex -> tagged :regex (raw source) + ((char=? c #\") ; #"..." -> a regex VALUE (Clojure parity: + ;; the reader constructs the Pattern, so a macro gets a regex, not a form). + ;; The analyzer compiles a regex value to the same :regex IR leaf via its + ;; source string. (let-values (((src j) (rdr-read-regex s (+ i 1) end))) - (values (rdr-make-tagged (keyword #f "regex") src) j))) + (values (jolt-re-pattern src) j))) ((char=? c #\_) ; #_ discard the next form (let-values (((_ j) (rdr-read-form s (+ i 1) end))) (when (rdr-eof? _) (jolt-throw (jolt-ex-info "EOF after #_" (empty-pmap)))) diff --git a/host/chez/records.ss b/host/chez/records.ss index 2bf7c04..469ac99 100644 --- a/host/chez/records.ss +++ b/host/chez/records.ss @@ -158,6 +158,8 @@ ((or (cseq? obj) (empty-list-t? obj)) '("ASeq" "ISeq" "IPersistentCollection" "Sequential" "Collection" "Iterable" "java.lang.Iterable" "Object")) ;; java.net.URI jhost — extend-protocol java.net.URI (hiccup ToURI/ToStr). ((and (jhost? obj) (string=? (jhost-tag obj) "uri")) '("URI" "java.net.URI" "Object")) + ;; a regex VALUE — extend-protocol java.util.regex.Pattern (core.match.regex). + ((regex-t? obj) '("Pattern" "java.util.regex.Pattern" "Object")) ;; host value types a library may extend a protocol to by class (data.json ;; extends JSONWriter to java.util.UUID / java.util.Date / java.math.BigDecimal). ((juuid? obj) '("UUID" "java.util.UUID" "Object")) @@ -236,6 +238,7 @@ "Map" "java.util.Map" "List" "java.util.List" "Set" "java.util.Set" "Collection" "java.util.Collection" "Iterable" "java.lang.Iterable" "UUID" "BigDecimal" "Date" "Timestamp" "Instant" "java.sql.Date" + "Pattern" "java.util.regex.Pattern" ;; java.time value types (extend-protocol Duration / ZonedDateTime / …) "Duration" "Period" "LocalDate" "LocalTime" "LocalDateTime" "ZonedDateTime" "OffsetDateTime" "OffsetTime" "ZoneId" "ZoneOffset" @@ -247,6 +250,7 @@ (and (> (string-length s) pl) (string=? (substring s 0 pl) p) (substring s pl (string-length s))))) (define (canonical-host-tag type-name) (let ((base (or (strip-prefix type-name "java.lang.") + (strip-prefix type-name "java.util.regex.") (strip-prefix type-name "java.util.") (strip-prefix type-name "java.net.") (strip-prefix type-name "java.math.") diff --git a/host/chez/seed/image.ss b/host/chez/seed/image.ss index d2da0dc..8288f75 100644 --- a/host/chez/seed/image.ss +++ b/host/chez/seed/image.ss @@ -195,7 +195,7 @@ (guard (e (#t #f)) (def-var! "jolt.backend-scheme" "emit-quoted-map-value" (letrec ((emit-quoted-map-value (lambda (m) (let fnrec6335 ((m m)) (let* ((pairs (jolt-invoke (var-deref "clojure.core" "sort") (let* ((_a$6341 (lambda (k) (let fnrec6336 ((k k)) (let* ((_a$6337 (var-deref "clojure.core" "str")) (_a$6338 (jolt-invoke (var-deref "jolt.backend-scheme" "emit-quoted") k)) (_a$6339 " ") (_a$6340 (jolt-invoke (var-deref "jolt.backend-scheme" "emit-quoted") (jolt-get m k)))) (jolt-invoke _a$6337 _a$6338 _a$6339 _a$6340))))) (_a$6342 (jolt-keys m))) (jolt-map _a$6341 _a$6342))))) (jolt-invoke (var-deref "clojure.core" "str") "(jolt-hash-map " (jolt-invoke (var-deref "clojure.string" "join") " " pairs) ")")))))) emit-quoted-map-value))) (guard (e (#t #f)) - (def-var! "jolt.backend-scheme" "emit-quoted" (letrec ((emit-quoted (lambda (form) (let fnrec6343 ((form form)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-char?") form)) (jolt-invoke (var-deref "jolt.backend-scheme" "emit-const") form) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-literal?") form)) (jolt-invoke (var-deref "jolt.backend-scheme" "emit-const") form) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") form)) (let* ((m (jolt-invoke (var-deref "jolt.host" "form-sym-meta") form)) (sns (jolt-invoke (var-deref "jolt.host" "form-sym-ns") form)) (nm (jolt-invoke (var-deref "jolt.host" "form-sym-name") form))) (if (jolt-truthy? (let* ((and__25__auto m)) (if (jolt-truthy? and__25__auto) (jolt-pos? (jolt-count m)) and__25__auto))) (let* ((_a$6344 (var-deref "clojure.core" "str")) (_a$6345 "(jolt-symbol/meta ") (_a$6346 (if (jolt-truthy? sns) (jolt-invoke (var-deref "jolt.backend-scheme" "chez-str-lit") sns) "#f")) (_a$6347 " ") (_a$6348 (jolt-invoke (var-deref "jolt.backend-scheme" "chez-str-lit") nm)) (_a$6349 " ") (_a$6350 (jolt-invoke emit-quoted m)) (_a$6351 ")")) (jolt-invoke _a$6344 _a$6345 _a$6346 _a$6347 _a$6348 _a$6349 _a$6350 _a$6351)) (let* ((_a$6352 (var-deref "clojure.core" "str")) (_a$6353 "(jolt-symbol ") (_a$6354 (if (jolt-truthy? sns) (jolt-invoke (var-deref "jolt.backend-scheme" "chez-str-lit") sns) "#f")) (_a$6355 " ") (_a$6356 (jolt-invoke (var-deref "jolt.backend-scheme" "chez-str-lit") nm)) (_a$6357 ")")) (jolt-invoke _a$6352 _a$6353 _a$6354 _a$6355 _a$6356 _a$6357)))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-set?") form)) (jolt-invoke (var-deref "clojure.core" "str") "(jolt-hash-set " (jolt-invoke (var-deref "clojure.string" "join") " " (jolt-invoke (var-deref "clojure.core" "sort") (jolt-map emit-quoted (jolt-invoke (var-deref "jolt.host" "form-set-items") form)))) ")") (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-list?") form)) (jolt-invoke (var-deref "clojure.core" "str") "(jolt-list " (jolt-invoke (var-deref "clojure.string" "join") " " (jolt-map emit-quoted (jolt-invoke (var-deref "jolt.host" "form-elements") form))) ")") (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-vec?") form)) (jolt-invoke (var-deref "clojure.core" "str") "(jolt-vector " (jolt-invoke (var-deref "clojure.string" "join") " " (jolt-map emit-quoted (jolt-invoke (var-deref "jolt.host" "form-vec-items") form))) ")") (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-map?") form)) (jolt-invoke (var-deref "jolt.backend-scheme" "emit-quoted-map") (jolt-invoke (var-deref "jolt.host" "form-map-pairs") form)) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "map?") form)) (jolt-invoke (var-deref "jolt.backend-scheme" "emit-quoted-map-value") form) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "vector?") form)) (jolt-invoke (var-deref "clojure.core" "str") "(jolt-vector " (jolt-invoke (var-deref "clojure.string" "join") " " (jolt-map emit-quoted form)) ")") (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "set?") form)) (jolt-invoke (var-deref "clojure.core" "str") "(jolt-hash-set " (jolt-invoke (var-deref "clojure.string" "join") " " (jolt-invoke (var-deref "clojure.core" "sort") (jolt-map emit-quoted form))) ")") (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "seq?") form)) (jolt-invoke (var-deref "clojure.core" "str") "(jolt-list " (jolt-invoke (var-deref "clojure.string" "join") " " (jolt-map emit-quoted form)) ")") (if (jolt-truthy? (keyword #f "else")) (jolt-throw (let* ((_a$6358 (jolt-invoke (var-deref "clojure.core" "str") "emit-quoted: unsupported quoted form " (jolt-invoke (var-deref "clojure.core" "pr-str") form))) (_a$6359 (jolt-hash-map))) (jolt-ex-info _a$6358 _a$6359))) jolt-nil)))))))))))))))) emit-quoted))) + (def-var! "jolt.backend-scheme" "emit-quoted" (letrec ((emit-quoted (lambda (form) (let fnrec6343 ((form form)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-char?") form)) (jolt-invoke (var-deref "jolt.backend-scheme" "emit-const") form) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-literal?") form)) (jolt-invoke (var-deref "jolt.backend-scheme" "emit-const") form) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") form)) (let* ((m (jolt-invoke (var-deref "jolt.host" "form-sym-meta") form)) (sns (jolt-invoke (var-deref "jolt.host" "form-sym-ns") form)) (nm (jolt-invoke (var-deref "jolt.host" "form-sym-name") form))) (if (jolt-truthy? (let* ((and__25__auto m)) (if (jolt-truthy? and__25__auto) (jolt-pos? (jolt-count m)) and__25__auto))) (let* ((_a$6344 (var-deref "clojure.core" "str")) (_a$6345 "(jolt-symbol/meta ") (_a$6346 (if (jolt-truthy? sns) (jolt-invoke (var-deref "jolt.backend-scheme" "chez-str-lit") sns) "#f")) (_a$6347 " ") (_a$6348 (jolt-invoke (var-deref "jolt.backend-scheme" "chez-str-lit") nm)) (_a$6349 " ") (_a$6350 (jolt-invoke emit-quoted m)) (_a$6351 ")")) (jolt-invoke _a$6344 _a$6345 _a$6346 _a$6347 _a$6348 _a$6349 _a$6350 _a$6351)) (let* ((_a$6352 (var-deref "clojure.core" "str")) (_a$6353 "(jolt-symbol ") (_a$6354 (if (jolt-truthy? sns) (jolt-invoke (var-deref "jolt.backend-scheme" "chez-str-lit") sns) "#f")) (_a$6355 " ") (_a$6356 (jolt-invoke (var-deref "jolt.backend-scheme" "chez-str-lit") nm)) (_a$6357 ")")) (jolt-invoke _a$6352 _a$6353 _a$6354 _a$6355 _a$6356 _a$6357)))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-set?") form)) (jolt-invoke (var-deref "clojure.core" "str") "(jolt-hash-set " (jolt-invoke (var-deref "clojure.string" "join") " " (jolt-invoke (var-deref "clojure.core" "sort") (jolt-map emit-quoted (jolt-invoke (var-deref "jolt.host" "form-set-items") form)))) ")") (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-list?") form)) (jolt-invoke (var-deref "clojure.core" "str") "(jolt-list " (jolt-invoke (var-deref "clojure.string" "join") " " (jolt-map emit-quoted (jolt-invoke (var-deref "jolt.host" "form-elements") form))) ")") (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-vec?") form)) (jolt-invoke (var-deref "clojure.core" "str") "(jolt-vector " (jolt-invoke (var-deref "clojure.string" "join") " " (jolt-map emit-quoted (jolt-invoke (var-deref "jolt.host" "form-vec-items") form))) ")") (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-map?") form)) (jolt-invoke (var-deref "jolt.backend-scheme" "emit-quoted-map") (jolt-invoke (var-deref "jolt.host" "form-map-pairs") form)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-regex?") form)) (jolt-invoke (var-deref "clojure.core" "str") "(jolt-regex " (jolt-invoke (var-deref "jolt.backend-scheme" "chez-str-lit") (jolt-invoke (var-deref "jolt.host" "form-regex-source") form)) ")") (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "map?") form)) (jolt-invoke (var-deref "jolt.backend-scheme" "emit-quoted-map-value") form) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "vector?") form)) (jolt-invoke (var-deref "clojure.core" "str") "(jolt-vector " (jolt-invoke (var-deref "clojure.string" "join") " " (jolt-map emit-quoted form)) ")") (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "set?") form)) (jolt-invoke (var-deref "clojure.core" "str") "(jolt-hash-set " (jolt-invoke (var-deref "clojure.string" "join") " " (jolt-invoke (var-deref "clojure.core" "sort") (jolt-map emit-quoted form))) ")") (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "seq?") form)) (jolt-invoke (var-deref "clojure.core" "str") "(jolt-list " (jolt-invoke (var-deref "clojure.string" "join") " " (jolt-map emit-quoted form)) ")") (if (jolt-truthy? (keyword #f "else")) (jolt-throw (let* ((_a$6358 (jolt-invoke (var-deref "clojure.core" "str") "emit-quoted: unsupported quoted form " (jolt-invoke (var-deref "clojure.core" "pr-str") form))) (_a$6359 (jolt-hash-map))) (jolt-ex-info _a$6358 _a$6359))) jolt-nil))))))))))))))))) emit-quoted))) (guard (e (#t #f)) (def-var! "jolt.backend-scheme" "jmeta-nonempty?" (letrec ((jmeta-nonempty? (lambda (m) (let fnrec6360 ((m m)) (let* ((and__25__auto (jolt-invoke (var-deref "clojure.core" "map?") m))) (if (jolt-truthy? and__25__auto) (jolt-pos? (jolt-count m)) and__25__auto)))))) jmeta-nonempty?))) (guard (e (#t #f)) diff --git a/host/chez/seed/prelude.ss b/host/chez/seed/prelude.ss index 043b835..0120511 100644 --- a/host/chez/seed/prelude.ss +++ b/host/chez/seed/prelude.ss @@ -874,7 +874,7 @@ (def-var! "clojure.core" "group-by-head" (letrec ((group-by-head (lambda (items) (let fnrec3338 ((items items)) (let* ((_a$3342 (lambda (acc x) (let fnrec3339 ((acc acc) (x x)) (if (jolt-truthy? (let* ((or__26__auto (jolt-invoke (var-deref "clojure.core" "symbol?") x))) (if (jolt-truthy? or__26__auto) or__26__auto (jolt-invoke (var-deref "clojure.core" "nil?") x)))) (jolt-conj acc (jolt-vector x)) (let* ((_a$3340 (jolt-pop acc)) (_a$3341 (jolt-conj (jolt-peek acc) x))) (jolt-conj _a$3340 _a$3341)))))) (_a$3343 (jolt-vector)) (_a$3344 items)) (jolt-reduce _a$3342 _a$3343 _a$3344)))))) group-by-head))) (guard (e (#t #f)) (def-var! "clojure.core" "deftype" - (lambda (tname fields . body) (let fnrec3345 ((tname tname) (fields fields) (body (list->cseq body))) (let* ((unwrap (lambda (x) (let fnrec3346 ((x x)) (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "clojure.core" "seq?") x))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-invoke (var-deref "clojure.core" "symbol?") (jolt-first x)))) (if (jolt-truthy? and__25__auto) (jolt= "with-meta" (jolt-invoke (var-deref "clojure.core" "name") (jolt-first x))) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "clojure.core" "second") x) x)))) (tname (jolt-invoke unwrap tname)) (fields (jolt-map unwrap fields)) (arrow (jolt-invoke (var-deref "clojure.core" "symbol") (jolt-invoke (var-deref "clojure.core" "str") "->" (jolt-invoke (var-deref "clojure.core" "name") tname)))) (field-kws (jolt-map (lambda (f) (let fnrec3347 ((f f)) (jolt-invoke (var-deref "clojure.core" "keyword") (jolt-invoke (var-deref "clojure.core" "name") f)))) fields)) (field-tags (jolt-map (lambda (f) (let fnrec3348 ((f f)) (let* ((mt (jolt-invoke (var-deref "clojure.core" "meta") f))) (if (jolt-truthy? (let* ((and__25__auto mt)) (if (jolt-truthy? and__25__auto) (jolt-get mt (keyword #f "tag")) and__25__auto))) (jolt-get mt (keyword #f "tag")) (if (jolt-truthy? (let* ((and__25__auto mt)) (if (jolt-truthy? and__25__auto) (jolt-get mt (keyword #f "num")) and__25__auto))) "num" (if (jolt-truthy? (keyword #f "else")) jolt-nil jolt-nil)))))) fields)) (field-muts (jolt-map (lambda (f) (let fnrec3349 ((f f)) (let* ((mt (jolt-invoke (var-deref "clojure.core" "meta") f))) (if (jolt-truthy? (let* ((and__25__auto mt)) (if (jolt-truthy? and__25__auto) (let* ((or__26__auto (jolt-get mt (keyword #f "unsynchronized-mutable")))) (if (jolt-truthy? or__26__auto) or__26__auto (jolt-get mt (keyword #f "volatile-mutable")))) and__25__auto))) #t #f)))) fields)) (mutable-syms (jolt-map jolt-first (jolt-filter (var-deref "clojure.core" "second") (jolt-map jolt-vector fields field-muts)))) (mutable? (lambda (s) (let fnrec3350 ((s s)) (jolt-invoke (var-deref "clojure.core" "boolean") (jolt-invoke (var-deref "clojure.core" "some") (lambda (m) (let fnrec3351 ((m m)) (jolt= m s))) mutable-syms))))) (rewrite-set (letrec ((rw (lambda (inst form) (let fnrec3352 ((inst inst) (form form)) (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "clojure.core" "seq?") form))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-seq form))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-invoke (var-deref "clojure.core" "symbol?") (jolt-first form)))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt= "set!" (jolt-invoke (var-deref "clojure.core" "name") (jolt-first form))))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-invoke (var-deref "clojure.core" "symbol?") (jolt-invoke (var-deref "clojure.core" "second") form)))) (if (jolt-truthy? and__25__auto) (jolt-invoke mutable? (jolt-invoke (var-deref "clojure.core" "second") form)) and__25__auto)) and__25__auto)) and__25__auto)) and__25__auto)) and__25__auto))) (let* ((_a$3353 (jolt-symbol #f "set!")) (_a$3354 (jolt-list (jolt-invoke (var-deref "clojure.core" "symbol") (jolt-invoke (var-deref "clojure.core" "str") ".-" (jolt-invoke (var-deref "clojure.core" "name") (jolt-invoke (var-deref "clojure.core" "second") form)))) inst)) (_a$3355 (jolt-invoke rw inst (jolt-nth form 2)))) (jolt-list _a$3353 _a$3354 _a$3355)) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "seq?") form)) (jolt-map (lambda (x) (let fnrec3356 ((x x)) (jolt-invoke rw inst x))) form) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "vector?") form)) (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (x) (let fnrec3357 ((x x)) (jolt-invoke rw inst x))) form) (if (jolt-truthy? (keyword #f "else")) form jolt-nil)))))))) rw)) (impl (lambda (proto specs) (let fnrec3358 ((proto proto) (specs specs)) (let* ((ss (jolt-seq specs)) (methods (jolt-hash-map)) (order (jolt-vector))) (let loop3359 ((ss ss) (methods methods) (order order)) (if (jolt-empty? ss) (let* ((_a$3374 (var-deref "clojure.core" "__sqcat")) (_a$3375 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "do"))) (_a$3376 (jolt-invoke (var-deref "clojure.core" "__sq1") (let* ((_a$3360 (var-deref "clojure.core" "__sqcat")) (_a$3361 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "register-inline-protocol!"))) (_a$3362 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "name") tname))) (_a$3363 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "name") proto)))) (jolt-invoke _a$3360 _a$3361 _a$3362 _a$3363)))) (_a$3377 (jolt-map (lambda (mname) (let fnrec3364 ((mname mname)) (let* ((_a$3368 (var-deref "clojure.core" "__sqcat")) (_a$3369 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "register-inline-method"))) (_a$3370 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "name") tname))) (_a$3371 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "name") proto))) (_a$3372 (jolt-invoke (var-deref "clojure.core" "__sq1") mname)) (_a$3373 (jolt-invoke (var-deref "clojure.core" "__sq1") (let* ((_a$3365 (var-deref "clojure.core" "__sqcat")) (_a$3366 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "fn"))) (_a$3367 (jolt-get methods mname))) (jolt-invoke _a$3365 _a$3366 _a$3367))))) (jolt-invoke _a$3368 _a$3369 _a$3370 _a$3371 _a$3372 _a$3373)))) order))) (jolt-invoke _a$3374 _a$3375 _a$3376 _a$3377)) (let* ((spec (jolt-first ss)) (mname (jolt-invoke (var-deref "clojure.core" "name") (jolt-first spec))) (argv (jolt-nth spec 1)) (inst (jolt-first argv)) (binds (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "clojure.core" "mapcat") (lambda (f) (let fnrec3378 ((f f)) (let* ((_o$3383 f) (_o$3384 (let* ((_a$3379 (var-deref "clojure.core" "__sqcat")) (_a$3380 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "get"))) (_a$3381 (jolt-invoke (var-deref "clojure.core" "__sq1") inst)) (_a$3382 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "keyword") (jolt-invoke (var-deref "clojure.core" "name") f))))) (jolt-invoke _a$3379 _a$3380 _a$3381 _a$3382)))) (jolt-vector _o$3383 _o$3384)))) fields))) (mbody (let* ((_a$3386 (lambda (bf) (let fnrec3385 ((bf bf)) (jolt-invoke rewrite-set inst bf)))) (_a$3387 (jolt-drop 2 spec))) (jolt-map _a$3386 _a$3387))) (clause (jolt-list argv (jolt-invoke (var-deref "clojure.core" "list*") (jolt-symbol #f "let") binds mbody)))) (let* ((_a$3388 (jolt-rest ss)) (_a$3389 (jolt-assoc methods mname (jolt-conj (jolt-get methods mname (jolt-vector)) clause))) (_a$3390 (if (jolt-contains? methods mname) order (jolt-conj order mname)))) (loop3359 _a$3388 _a$3389 _a$3390)))))))))) (let* ((_a$3414 (var-deref "clojure.core" "__sqcat")) (_a$3415 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "do"))) (_a$3416 (jolt-invoke (var-deref "clojure.core" "__sq1") (let* ((_a$3400 (var-deref "clojure.core" "__sqcat")) (_a$3401 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "def"))) (_a$3402 (jolt-invoke (var-deref "clojure.core" "__sq1") tname)) (_a$3403 (jolt-invoke (var-deref "clojure.core" "__sq1") (let* ((_a$3394 (var-deref "clojure.core" "__sqcat")) (_a$3395 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "make-deftype-ctor"))) (_a$3396 (jolt-invoke (var-deref "clojure.core" "__sq1") (let* ((_a$3391 (var-deref "clojure.core" "__sqcat")) (_a$3392 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "quote"))) (_a$3393 (jolt-invoke (var-deref "clojure.core" "__sq1") tname))) (jolt-invoke _a$3391 _a$3392 _a$3393)))) (_a$3397 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqvec") field-kws))) (_a$3398 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqvec") field-tags))) (_a$3399 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqvec") field-muts)))) (jolt-invoke _a$3394 _a$3395 _a$3396 _a$3397 _a$3398 _a$3399))))) (jolt-invoke _a$3400 _a$3401 _a$3402 _a$3403)))) (_a$3417 (jolt-invoke (var-deref "clojure.core" "__sq1") (let* ((_a$3404 (var-deref "clojure.core" "__sqcat")) (_a$3405 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "def"))) (_a$3406 (jolt-invoke (var-deref "clojure.core" "__sq1") arrow)) (_a$3407 (jolt-invoke (var-deref "clojure.core" "__sq1") tname))) (jolt-invoke _a$3404 _a$3405 _a$3406 _a$3407)))) (_a$3418 (let* ((_a$3412 (lambda (g) (let fnrec3408 ((g g)) (let* ((_a$3409 impl) (_a$3410 (jolt-first g)) (_a$3411 (jolt-rest g))) (jolt-invoke _a$3409 _a$3410 _a$3411))))) (_a$3413 (jolt-invoke (var-deref "clojure.core" "group-by-head") body))) (jolt-map _a$3412 _a$3413))) (_a$3419 (jolt-invoke (var-deref "clojure.core" "__sq1") tname))) (jolt-invoke _a$3414 _a$3415 _a$3416 _a$3417 _a$3418 _a$3419)))))) + (lambda (tname fields . body) (let fnrec3345 ((tname tname) (fields fields) (body (list->cseq body))) (let* ((unwrap (lambda (x) (let fnrec3346 ((x x)) (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "clojure.core" "seq?") x))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-invoke (var-deref "clojure.core" "symbol?") (jolt-first x)))) (if (jolt-truthy? and__25__auto) (jolt= "with-meta" (jolt-invoke (var-deref "clojure.core" "name") (jolt-first x))) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "clojure.core" "second") x) x)))) (tname (jolt-invoke unwrap tname)) (fields (jolt-map unwrap fields)) (arrow (jolt-invoke (var-deref "clojure.core" "symbol") (jolt-invoke (var-deref "clojure.core" "str") "->" (jolt-invoke (var-deref "clojure.core" "name") tname)))) (field-kws (jolt-map (lambda (f) (let fnrec3347 ((f f)) (jolt-invoke (var-deref "clojure.core" "keyword") (jolt-invoke (var-deref "clojure.core" "name") f)))) fields)) (field-tags (jolt-map (lambda (f) (let fnrec3348 ((f f)) (let* ((mt (jolt-invoke (var-deref "clojure.core" "meta") f))) (if (jolt-truthy? (let* ((and__25__auto mt)) (if (jolt-truthy? and__25__auto) (jolt-get mt (keyword #f "tag")) and__25__auto))) (jolt-invoke (var-deref "clojure.core" "name") (jolt-get mt (keyword #f "tag"))) (if (jolt-truthy? (let* ((and__25__auto mt)) (if (jolt-truthy? and__25__auto) (jolt-get mt (keyword #f "num")) and__25__auto))) "num" (if (jolt-truthy? (keyword #f "else")) jolt-nil jolt-nil)))))) fields)) (field-muts (jolt-map (lambda (f) (let fnrec3349 ((f f)) (let* ((mt (jolt-invoke (var-deref "clojure.core" "meta") f))) (if (jolt-truthy? (let* ((and__25__auto mt)) (if (jolt-truthy? and__25__auto) (let* ((or__26__auto (jolt-get mt (keyword #f "unsynchronized-mutable")))) (if (jolt-truthy? or__26__auto) or__26__auto (jolt-get mt (keyword #f "volatile-mutable")))) and__25__auto))) #t #f)))) fields)) (mutable-syms (jolt-map jolt-first (jolt-filter (var-deref "clojure.core" "second") (jolt-map jolt-vector fields field-muts)))) (mutable? (lambda (s) (let fnrec3350 ((s s)) (jolt-invoke (var-deref "clojure.core" "boolean") (jolt-invoke (var-deref "clojure.core" "some") (lambda (m) (let fnrec3351 ((m m)) (jolt= m s))) mutable-syms))))) (rewrite-set (letrec ((rw (lambda (inst form) (let fnrec3352 ((inst inst) (form form)) (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "clojure.core" "seq?") form))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-seq form))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-invoke (var-deref "clojure.core" "symbol?") (jolt-first form)))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt= "set!" (jolt-invoke (var-deref "clojure.core" "name") (jolt-first form))))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-invoke (var-deref "clojure.core" "symbol?") (jolt-invoke (var-deref "clojure.core" "second") form)))) (if (jolt-truthy? and__25__auto) (jolt-invoke mutable? (jolt-invoke (var-deref "clojure.core" "second") form)) and__25__auto)) and__25__auto)) and__25__auto)) and__25__auto)) and__25__auto))) (let* ((_a$3353 (jolt-symbol #f "set!")) (_a$3354 (jolt-list (jolt-invoke (var-deref "clojure.core" "symbol") (jolt-invoke (var-deref "clojure.core" "str") ".-" (jolt-invoke (var-deref "clojure.core" "name") (jolt-invoke (var-deref "clojure.core" "second") form)))) inst)) (_a$3355 (jolt-invoke rw inst (jolt-nth form 2)))) (jolt-list _a$3353 _a$3354 _a$3355)) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "seq?") form)) (jolt-map (lambda (x) (let fnrec3356 ((x x)) (jolt-invoke rw inst x))) form) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "vector?") form)) (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (x) (let fnrec3357 ((x x)) (jolt-invoke rw inst x))) form) (if (jolt-truthy? (keyword #f "else")) form jolt-nil)))))))) rw)) (impl (lambda (proto specs) (let fnrec3358 ((proto proto) (specs specs)) (let* ((ss (jolt-seq specs)) (methods (jolt-hash-map)) (order (jolt-vector))) (let loop3359 ((ss ss) (methods methods) (order order)) (if (jolt-empty? ss) (let* ((_a$3374 (var-deref "clojure.core" "__sqcat")) (_a$3375 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "do"))) (_a$3376 (jolt-invoke (var-deref "clojure.core" "__sq1") (let* ((_a$3360 (var-deref "clojure.core" "__sqcat")) (_a$3361 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "register-inline-protocol!"))) (_a$3362 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "name") tname))) (_a$3363 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "name") proto)))) (jolt-invoke _a$3360 _a$3361 _a$3362 _a$3363)))) (_a$3377 (jolt-map (lambda (mname) (let fnrec3364 ((mname mname)) (let* ((_a$3368 (var-deref "clojure.core" "__sqcat")) (_a$3369 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "register-inline-method"))) (_a$3370 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "name") tname))) (_a$3371 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "name") proto))) (_a$3372 (jolt-invoke (var-deref "clojure.core" "__sq1") mname)) (_a$3373 (jolt-invoke (var-deref "clojure.core" "__sq1") (let* ((_a$3365 (var-deref "clojure.core" "__sqcat")) (_a$3366 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "fn"))) (_a$3367 (jolt-get methods mname))) (jolt-invoke _a$3365 _a$3366 _a$3367))))) (jolt-invoke _a$3368 _a$3369 _a$3370 _a$3371 _a$3372 _a$3373)))) order))) (jolt-invoke _a$3374 _a$3375 _a$3376 _a$3377)) (let* ((spec (jolt-first ss)) (mname (jolt-invoke (var-deref "clojure.core" "name") (jolt-first spec))) (argv (jolt-nth spec 1)) (inst (jolt-first argv)) (binds (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "clojure.core" "mapcat") (lambda (f) (let fnrec3378 ((f f)) (let* ((_o$3383 f) (_o$3384 (let* ((_a$3379 (var-deref "clojure.core" "__sqcat")) (_a$3380 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "get"))) (_a$3381 (jolt-invoke (var-deref "clojure.core" "__sq1") inst)) (_a$3382 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "keyword") (jolt-invoke (var-deref "clojure.core" "name") f))))) (jolt-invoke _a$3379 _a$3380 _a$3381 _a$3382)))) (jolt-vector _o$3383 _o$3384)))) fields))) (mbody (let* ((_a$3386 (lambda (bf) (let fnrec3385 ((bf bf)) (jolt-invoke rewrite-set inst bf)))) (_a$3387 (jolt-drop 2 spec))) (jolt-map _a$3386 _a$3387))) (clause (jolt-list argv (jolt-invoke (var-deref "clojure.core" "list*") (jolt-symbol #f "let") binds mbody)))) (let* ((_a$3388 (jolt-rest ss)) (_a$3389 (jolt-assoc methods mname (jolt-conj (jolt-get methods mname (jolt-vector)) clause))) (_a$3390 (if (jolt-contains? methods mname) order (jolt-conj order mname)))) (loop3359 _a$3388 _a$3389 _a$3390)))))))))) (let* ((_a$3414 (var-deref "clojure.core" "__sqcat")) (_a$3415 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "do"))) (_a$3416 (jolt-invoke (var-deref "clojure.core" "__sq1") (let* ((_a$3400 (var-deref "clojure.core" "__sqcat")) (_a$3401 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "def"))) (_a$3402 (jolt-invoke (var-deref "clojure.core" "__sq1") tname)) (_a$3403 (jolt-invoke (var-deref "clojure.core" "__sq1") (let* ((_a$3394 (var-deref "clojure.core" "__sqcat")) (_a$3395 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "make-deftype-ctor"))) (_a$3396 (jolt-invoke (var-deref "clojure.core" "__sq1") (let* ((_a$3391 (var-deref "clojure.core" "__sqcat")) (_a$3392 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "quote"))) (_a$3393 (jolt-invoke (var-deref "clojure.core" "__sq1") tname))) (jolt-invoke _a$3391 _a$3392 _a$3393)))) (_a$3397 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqvec") field-kws))) (_a$3398 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqvec") field-tags))) (_a$3399 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqvec") field-muts)))) (jolt-invoke _a$3394 _a$3395 _a$3396 _a$3397 _a$3398 _a$3399))))) (jolt-invoke _a$3400 _a$3401 _a$3402 _a$3403)))) (_a$3417 (jolt-invoke (var-deref "clojure.core" "__sq1") (let* ((_a$3404 (var-deref "clojure.core" "__sqcat")) (_a$3405 (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "def"))) (_a$3406 (jolt-invoke (var-deref "clojure.core" "__sq1") arrow)) (_a$3407 (jolt-invoke (var-deref "clojure.core" "__sq1") tname))) (jolt-invoke _a$3404 _a$3405 _a$3406 _a$3407)))) (_a$3418 (let* ((_a$3412 (lambda (g) (let fnrec3408 ((g g)) (let* ((_a$3409 impl) (_a$3410 (jolt-first g)) (_a$3411 (jolt-rest g))) (jolt-invoke _a$3409 _a$3410 _a$3411))))) (_a$3413 (jolt-invoke (var-deref "clojure.core" "group-by-head") body))) (jolt-map _a$3412 _a$3413))) (_a$3419 (jolt-invoke (var-deref "clojure.core" "__sq1") tname))) (jolt-invoke _a$3414 _a$3415 _a$3416 _a$3417 _a$3418 _a$3419)))))) (mark-macro! "clojure.core" "deftype")) (guard (e (#t #f)) (def-var! "clojure.core" "defprotocol" diff --git a/jolt-core/clojure/core/30-macros.clj b/jolt-core/clojure/core/30-macros.clj index 5617dfd..454379a 100644 --- a/jolt-core/clojure/core/30-macros.clj +++ b/jolt-core/clojure/core/30-macros.clj @@ -292,7 +292,7 @@ ;; exact type up front, so reading it back carries that type (not :any) — ;; the key to fast nested-record code. Spliced as a vector literal too. field-tags (map (fn [f] (let [mt (meta f)] - (cond (and mt (:tag mt)) (:tag mt) + (cond (and mt (:tag mt)) (name (:tag mt)) ; symbol or string -> string (and mt (:num mt)) "num" :else nil))) fields) diff --git a/jolt-core/jolt/backend_scheme.clj b/jolt-core/jolt/backend_scheme.clj index 4f5067c..abce8af 100644 --- a/jolt-core/jolt/backend_scheme.clj +++ b/jolt-core/jolt/backend_scheme.clj @@ -11,7 +11,8 @@ [jolt.host :refer [form-sym? form-sym-name form-sym-ns form-sym-meta form-list? form-vec? form-map? form-set? form-char? form-literal? form-elements form-vec-items - form-map-pairs form-set-items form-char-code]])) + form-map-pairs form-set-items form-char-code + form-regex? form-regex-source]])) ;; Hot clojure.core primitives lowered to native Scheme. ;; `=` is the exactness-aware jolt= from values.ss; inc/dec/ @@ -289,6 +290,8 @@ (form-list? form) (str "(jolt-list " (str/join " " (map emit-quoted (form-elements form))) ")") (form-vec? form) (str "(jolt-vector " (str/join " " (map emit-quoted (form-vec-items form))) ")") (form-map? form) (emit-quoted-map (form-map-pairs form)) + ;; a quoted #"…" regex value -> reconstruct it (same as the :regex IR leaf). + (form-regex? form) (str "(jolt-regex " (chez-str-lit (form-regex-source form)) ")") ;; plain jolt VALUES (metadata maps and anything nested in them) (map? form) (emit-quoted-map-value form) (vector? form) (str "(jolt-vector " (str/join " " (map emit-quoted form)) ")") diff --git a/test/chez/corpus.edn b/test/chez/corpus.edn index ea20d06..0159023 100644 --- a/test/chez/corpus.edn +++ b/test/chez/corpus.edn @@ -1052,7 +1052,8 @@ {:suite "metadata / type hints" :label "type hint in let" :expected "6" :actual "(let [^long x 5] (inc x))"} {:suite "metadata / type hints" :label "type hint in body" :expected "2" :actual "(let [s \"ab\"] (count ^String s))"} {:suite "metadata / type hints" :label "type hint in destructure" :expected "3" :actual "(let [{:keys [^long a]} {:a 3}] a)"} - {:suite "metadata / type hints" :label "symbol hint -> :tag" :expected "\"String\"" :actual "(:tag (meta (read-string \"^String x\")))"} + {:suite "metadata / type hints" :label "symbol hint -> :tag is a symbol" :expected "true" :actual "(symbol? (:tag (meta (read-string \"^String x\"))))"} + {:suite "metadata / type hints" :label "symbol hint -> :tag name" :expected "\"String\"" :actual "(name (:tag (meta (read-string \"^String x\"))))"} {:suite "metadata / type hints" :label "keyword hint -> true" :expected "true" :actual "(:foo (meta (read-string \"^:foo x\")))"} {:suite "metadata / read data metadata" :label "vector data meta" :expected "{:ref true}" :actual "(meta (read-string \"^:ref [:greeting]\"))"} {:suite "metadata / read data metadata" :label "map data meta" :expected "{:k 1}" :actual "(meta (read-string \"^{:k 1} {:a 2}\"))"} @@ -3077,4 +3078,8 @@ {:suite "interop / java.util.Date" :label "deprecated getYear/getMonth" :expected "[110 0]" :actual "(let [d (java.util.Date. 110 0 15)] [(.getYear d) (.getMonth d)])"} {:suite "clojure.set / variadic" :label "union of 4 sets" :expected "#{1 2 3 4}" :actual "(do (require (quote clojure.set)) (clojure.set/union #{1} #{2} #{3} #{4}))"} {:suite "clojure.set / variadic" :label "intersection of 3 sets" :expected "#{3}" :actual "(do (require (quote clojure.set)) (clojure.set/intersection #{1 2 3} #{2 3 4} #{3 4 5}))"} + {:suite "regex / literal value" :label "literal is a Pattern" :expected "true" :actual "(instance? java.util.regex.Pattern #\"a.c\")"} + {:suite "regex / literal value" :label "re-matches on a literal" :expected "\"aaa\"" :actual "(re-matches #\"a+\" \"aaa\")"} + {:suite "regex / literal value" :label "quoted regex round-trips" :expected "\"#\\\"a.c\\\"\"" :actual "(pr-str (quote #\"a.c\"))"} + {:suite "regex / literal value" :label "extend-protocol to Pattern dispatches" :expected "[:pattern :other]" :actual "(do (defprotocol Tg (tg [_])) (extend-protocol Tg java.util.regex.Pattern (tg [_] :pattern) Object (tg [_] :other)) [(tg #\"x\") (tg 1)])"} ] diff --git a/test/conformance/known-divergences.edn b/test/conformance/known-divergences.edn index e41ef18..7ea0e7e 100644 --- a/test/conformance/known-divergences.edn +++ b/test/conformance/known-divergences.edn @@ -26,9 +26,6 @@ {:suite "io / cold tagged types via print-method", :label "transient vector", :category :printer-model} - {:suite "metadata / type hints", - :label "symbol hint -> :tag", - :category :host-model} {:suite "untested / JVM-shape stubs (documented jolt behavior)", :label "bean is the map", :category :host-model}