All notable changes to meme-clj will be documented in this file.
The format is based on Keep a Changelog.
meme.* (no more meme.alpha.*)get-lang: fixed variable shadowing that broke "Available langs" display\uNNNN with invalid hex digits now throws instead of silently producing wrong valuesload-resource-edn gives clear message when resource not found on classpath; clj->forms preserves source context in error ex-data; removed inconsistent trailing period in CLJS tagged-literal errormeme.emit.printer (tagged literal field access)meme.lang, meme.forms, meme.emit.render; fixed run-stages "full pipeline" misrepresentation; fixed indentation on clj-> function docstringspipeline namespace references in api.md, PRD.md, design-decisions.md; fixed wrong REPL launch command in api.md; removed phantom lang.util from platform tiers; corrected convert lang count in PRD.md.clj shim + .meme bootstrap with plain Clojure; generic dispatcher delegates to lang map functions; CLI opts (e.g. --width) pass through to langsmeme.convert module: removed in favor of :to-clj / :to-meme commands on lang maps. Use ((:to-clj (meme.lang/resolve-lang :meme-rewrite)) src) for multi-lang conversion, or meme.core/meme->clj for the classic path.meme.core/version: runtime version access — @meme.core/version returns "1.0.0":classic, :rewrite, :ts-trs in meme.lang/resolve-lang now emit a deprecation warning. Use :meme-classic, :meme-rewrite, :meme-trs instead.match-pattern now matches map patterns by key ({:k ?x} matches {:k 42}) and set patterns by element presencerewrite-once descends into maps (excluding records) and sets, so rules match subexpressions inside map values/keys and set elementsf(x)(y) → ((f x) y) — fixed left-to-right scan in rewrite-level with re-check after matchformat(format(x)) == format(x).meme fixture covering Clojure/meme code in comments, multiple semicolons, commented-out code, mid-expression and trailing commentsbenchmark_test now exercises classic, rewrite, and ts-trs across 11 fixtures and 7,526 vendor forms"hello\ now reports "Incomplete escape sequence" instead of misleading "Unterminated string"" inside regex now escaped in output, matching printer.cljc behavior:meme.opts/prelude corrected from string? to (s/coll-of any?) matching runtime type (vector of forms)gen-meme-text set generator now deduplicates elements, fixing intermittent prop-meme-text-roundtrip failurememe convert --lang meme-classic|meme-rewrite selects the conversion lang; meme inspect --lang shows lang infomeme.convert): single dispatch point for all three langsbenchmark_test.clj): benchmarks all three langs across 11 meme fixtures and 7,526 vendor forms from 7 real-world Clojure librariesregister! API for guest languages with custom preludes, rewrite rules, and parsers (meme.lang)?x/??x pattern variables, cycle detection, and fixed-point iteration (meme.rewrite)meme.rewrite.tree)meme.stages.contract)nil(1 2) → (nil 1 2). Any value can be a head. Previously these were rejected artificially.clojure.core// now reads as one symbol (namespace clojure.core, name /). Previously split into two tokens.M suffix, BigInt N suffix, ##NaN/##Inf/##-Inf, tagged literals, named chars (\newline etc.), pr-str fallback for UUID/Date:read-cond :preserve during conversion, preserving #?(:clj ...) branches in outputstep-expand-syntax-quotes before eval, matching the user-code pathbuild-tree now validates expected delimiters after #? and #:ns prefixesdoc/development.mdMemeRaw, MemeSyntaxQuote, and other AST node defrecords satisfy (map? x), causing silent mishandling in expand-sq, normalize-bare-percent, find-percent-params, pp, and max-percent-n. All dispatch sites now guard with forms/raw?, forms/syntax-quote?, etc. before the (map? form) branch.#?@(:clj [2 3]) inside a collection now correctly splices elements ([1 #?@(:clj [2 3]) 4] produces [1 2 3 4], not [1 [2 3] 4]). Non-sequential splice values produce a clear error.+42N and +3/4 now parse correctly. BigInteger constructor rejects leading +; sign is now stripped before construction (matching hex/octal/radix branches).nil(x), true(x), false(x) are now valid meme syntax, producing the lists (nil x), (true x), (false x). The syntactic rule f(args) → (f args) applies uniformly regardless of head type.x `` now correctly produces double-quoting (code that generates the inner expansion), matching Clojure's behavior. Previously the inner expansion was returned directly, losing one nesting level.expand-sq, expand-syntax-quotes, expand-forms) moved from meme.parse.reader to new meme.parse.expander namespace.strip-internal-meta) and percent-param-type extracted to meme.forms to prevent drift between reader and printer.test-cljs to deploy job dependencies).Initial public alpha release.
:meme/sugar metadata preservationMemeSyntaxQuote), expanded before evalMemeRaw) for numbers/chars/strings with alternate notation:read-cond :preserve option for lossless reader conditional roundtrips:incomplete continuation protocol.memeCan you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |