jolt/test/spec
Yogthos d1d3f390ff core: fn*/let*/loop* are plain-symbol primitives, matching Clojure (jolt-f79)
jolt-f79 asked to compile destructuring in fn* rest params. Checking
against Clojure inverts the premise: Clojure's fn* REJECTS destructuring
at compile time ('fn params must be Symbols'; let*/loop* 'Bad binding
form, expected symbol'). So the self-hosted analyzer was already correct
— fn*/let*/loop* are plain-symbol primitives; the fn/let/loop/defn
MACROS desugar destructuring. The real defect was the interpreter
leniently destructuring raw fn*, and defn emitting raw fn* to rely on it.

Changes:
- evaluator: fn*/let*/loop* now reject non-symbol binding forms with
  Clojure's exact messages (require-symbol-params/plain-sym?), so the
  interpreter agrees with the analyzer + Clojure.
- 00-syntax: defn emits the fn MACRO (not raw fn*) so destructuring
  params desugar; unnamed, so self-recursion still resolves via the var.
- 00-syntax: completing that exposed a real gap — the overlay destructure
  fn didn't handle kwargs (a map pattern bound against a fn's sequential
  rest); it had only worked via the interpreter's destructure-bind. Added
  the seq->map coercion to the map? branch (sequential: 1 map elt => that
  map, else apply hash-map), matching destructure-bind so interpret ==
  compile.

Net: fn*/let*/loop* are plain-symbol primitives across interpreter,
analyzer, and Clojure; all real destructuring (fn/defn/let/loop/macro
params, incl kwargs & {:keys}) compiles through the macros with no
interpreter fallback. Regression spec added.

Gate green: conformance 267x3, fallback-zero 31/5, bootstrap-fixpoint
stage1==2==3, self-host, staged-bootstrap, lazy-infinite 44/44,
clojure-test-suite >=4034/67, sci-bootstrap, features 78/78, all
unit+spec (destructuring 50/50).
2026-06-09 13:14:34 -04:00
..
control-flow-spec.janet Compiler research (#10) 2026-06-09 07:30:25 +08:00
core-async-spec.janet feat: core.async Phase 3 — channel transducers + dropping/sliding buffers 2026-06-05 15:40:24 -04:00
destructuring-spec.janet core: fn*/let*/loop* are plain-symbol primitives, matching Clojure (jolt-f79) 2026-06-09 13:14:34 -04:00
exceptions-spec.janet Compiler research (#10) 2026-06-09 07:30:25 +08:00
functions-spec.janet test(spec): control-flow, functions, destructuring — fix loop destructuring 2026-06-05 00:16:15 -04:00
futures-spec.janet feat: futures on real OS threads (ev/thread) 2026-06-05 20:00:11 -04:00
host-interop-spec.janet Compiler research (#10) 2026-06-09 07:30:25 +08:00
lazy-seqs-spec.janet test: fold phase ports into spec; promote compile-mode test 2026-06-05 01:07:09 -04:00
lists-spec.janet test(spec): collections contract (sequences, vectors, lists, maps, sets) 2026-06-05 00:08:37 -04:00
macros-spec.janet Compiler research (#10) 2026-06-09 07:30:25 +08:00
maps-spec.janet Compiler research (#10) 2026-06-09 07:30:25 +08:00
metadata-spec.janet Compiler research (#10) 2026-06-09 07:30:25 +08:00
multimethods-spec.janet test: fold phase ports into spec; promote compile-mode test 2026-06-05 01:07:09 -04:00
namespaces-spec.janet fix: catch binds unwrapped thrown value; var-set targets thread binding 2026-06-05 01:23:52 -04:00
nrepl-spec.janet feat(nrepl): nREPL server + client in Clojure on a Janet interop bridge 2026-06-05 21:25:23 -04:00
numbers-spec.janet feat(strictness): numeric ops reject non-numbers/non-integers like Clojure 2026-06-05 10:58:21 -04:00
predicates-spec.janet Compiler research (#10) 2026-06-09 07:30:25 +08:00
protocols-spec.janet test: fold phase ports into spec; promote compile-mode test 2026-06-05 01:07:09 -04:00
reader-syntax-spec.janet reader: one-char literals for non-symbol chars (\{ \( \, \%) 2026-06-06 00:10:17 -04:00
sequences-spec.janet Compiler research (#10) 2026-06-09 07:30:25 +08:00
sets-spec.janet fix: value-semantics for collection keys/elements; set literals evaluate 2026-06-05 01:02:00 -04:00
state-spec.janet test: fold ported-clojure batteries into spec 2026-06-05 07:50:16 -04:00
strings-spec.janet Compiler research (#10) 2026-06-09 07:30:25 +08:00
transducers-spec.janet fix: transducers/reduce short-circuit over infinite seqs via reduced 2026-06-05 09:18:35 -04:00
transients-spec.janet feat(strictness): subs validates bounds; assoc! bounds-checks vector index 2026-06-05 14:07:14 -04:00
truthiness-spec.janet test: fold ported-clojure batteries into spec 2026-06-05 07:50:16 -04:00
vectors-spec.janet Compiler research (#10) 2026-06-09 07:30:25 +08:00