_type: issue

title: CRITICAL: map literals don't evaluate values — (let [x 5] {:a x}) => {:a x}; fixing it eagerly hard-crashes SCI bootstrap (protocol maps ref unloaded sci.impl.core-protocols/records/deftype)

status: closed

issue_type: bug

created_by: Yogthos

close_reason: Closed


title: CRITICAL: vec/into over lazy-seq leaks PV struct; into {} builds int keys


title: Build phased Clojure conformance harness (extracted assertions)

issue_type: task


title: CRITICAL: iterate arity bug


title: CRITICAL: collections not callable as IFn (vector/map/set)


title: CRITICAL: self-referential lazy-seq/lazy-cat yields only literal prefix


title: CRITICAL: multi-collection map returns unrealized thunk


title: Port clojure-test-suite as integration battery

description: Build a minimal clojure.test + portability shim so Jolt can load the external ~/src/clojure-test-suite (240 per-fn .cljc files in clojure.test format). Add a baseline-guarded integration runner following the jank-conformance pattern (skip if absent).

assignee: Yogthos


title: Clear final 2 SCI bootstrap forms (Var/IVar collision + clojure.repl/template)

description: namespaces.cljc forms 126/127 fail: (126) lang_stubs IVar collides with real vars.cljc IVar so unbind dispatch misses on sci.lang.Var; (127) clojure.repl + clojure.template namespaces missing. Fix: trim bootstrap stubs to let real modules own canonical protocols/types; port clojure.repl + clojure.template.

close_reason: Done — SCI bootstrap now loads 422/422 with 0 failures. Fixed deftype protocol-method registration, with-meta on functions, select-keys over vectors, require :as+:refer, defmethod-on-fn; added clojure.set/join and host-module stubs. test-load-sci asserts 0 failures.


title: Persistent collections + build-time mutable/immutable toggle

description: Add JOLT_MUTABLE build flag (config.janet). Fix list-mutation bug (conj mutated original). Round 2: structural-sharing persistent vector (32-way trie) hooked into all core ops. Round 3: persistent lists / HAMT maps.

notes: R1 (build flag + list mutation fix) and R2 (structural-sharing persistent vectors + mutable toggle) done & pushed (1eb2843). Immutable: conformance 206/206, features 71/71, jank 119. R3 (persistent linked lists) pending user decision: lists are immutable Janet arrays — O(1) sharing cons, O(n) conj.

issue_type: feature

close_reason: Done across 3 rounds (pushed a0c9696): build-time mutable/immutable toggle, structural-sharing persistent vectors (32-way trie), and persistent O(1)-prepend linked lists. Plus bit-clear/get-method and a batch of missing core fns. conformance 206/206, features 78/78, jank 120.


title: HIGH: aliased namespace calls (require :as) don't resolve (s/join)


title: HIGH: dispatch — multimethod :default, protocol-on-record, extend-protocol


title: HIGH: update/update-in/assoc-in fail on map literals (struct)


title: HIGH: str semantics — (str nil)='nil' should be '', (str :b)='b' should be ':b'


title: HIGH: destructuring gaps (nested seq, :strs, nested map, fn-param)


title: phm-typed maps as set elements / map keys hash by identity

description: A map produced via hash-map/assoc (a Janet table/phm) used as a set element or map key hashes by identity, so #{{:a 1}} (struct elem) != #{(hash-map :a 1)} (phm elem) and such elements aren't retrievable by value. Map literals (structs) work. Needs value-based hashing for phm keys in PHM/PHS. Edge case; spec covers literal-map cases.

close_reason: Fixed: PHM/PHS canonicalize collection keys for value-based hashing/comparison; map literals & assoc promote to phm on collection keys; frequencies/group-by use phm base; set = is value-based. Also fixed set literals not evaluating elements and the REPL phm printer. Spec cases added. (commit pushed next)


title: MED: compiler path lacks IFn dispatch (collections-as-fn) — only interpreter fixed


title: MED: filter/take-while not lazy — infinite-seq (take N (filter p (range))) loops


title: MED: REPL display — def/defn should print #'ns/name; lazy-seq printer realizes only head ((0 <function>))


title: MED: missing core fns — letfn fnil trampoline doseq cycle partition-all reductions dedupe keep-indexed map-indexed transduce reduce-kv assoc-in peek subvec read-string format


title: throw of a caught ex-info rethrows wrapped; var-set on dynamic var in binding no-ops

description: Edges found via spec: (1) (catch :default e (throw e)) re-wraps the ex-info so the outer catch's (ex-message e) is nil. (2) (var-set #'*v* x) inside (binding [*v* ...] ...) doesn't update the thread-binding. Both rare; core try/catch/ex-info and dynamic binding work.

close_reason: Fixed: catch unwraps the :jolt/exception envelope so rethrow doesn't nest; var-set updates the current thread-binding frame (falls back to root). Spec cases restored.


title: regex: lookbehind, backreferences (\1), named groups (?<n>) unsupported (rare); engine is parse->PEG with backtracking

close_reason: Won't-fix: backreferences and lookbehind are not expressible in a PEG engine (jolt regex compiles to Janet PEG); named groups are rare. Documented as unsupported in README's Regex section. Reopen if a concrete need arises.


title: regex engine is a common subset (PEG-backed); lookaround/backrefs/named-groups unsupported


title: char type: chars represented as 1-char strings; (seq "ab") yields strings not \a \b — deferred design decision


title: transduce + transducer arities (1-arg map/filter/take); niche, deferred