diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 5647bb2..5141163 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -5,6 +5,7 @@ {"_type":"issue","id":"jolt-x8s","title":"CRITICAL: collections not callable as IFn (vector/map/set)","status":"closed","priority":1,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-06-04T17:46:14Z","created_by":"Yogthos","updated_at":"2026-06-04T17:50:54Z","closed_at":"2026-06-04T17:50:54Z","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"jolt-alz","title":"CRITICAL: self-referential lazy-seq/lazy-cat yields only literal prefix","status":"closed","priority":1,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-06-04T17:46:13Z","created_by":"Yogthos","updated_at":"2026-06-04T18:09:15Z","closed_at":"2026-06-04T18:09:15Z","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"jolt-wec","title":"CRITICAL: multi-collection map returns unrealized thunk","status":"closed","priority":1,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-06-04T17:46:12Z","created_by":"Yogthos","updated_at":"2026-06-04T18:06:02Z","closed_at":"2026-06-04T18:06:02Z","dependency_count":0,"dependent_count":0,"comment_count":0} +{"_type":"issue","id":"jolt-ns4","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.","status":"open","priority":2,"issue_type":"feature","owner":"yogthos@gmail.com","created_at":"2026-06-04T22:15:39Z","created_by":"Yogthos","updated_at":"2026-06-04T22:15:39Z","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"jolt-gxr","title":"HIGH: aliased namespace calls (require :as) don't resolve (s/join)","status":"closed","priority":2,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-06-04T18:09:58Z","created_by":"Yogthos","updated_at":"2026-06-04T18:45:52Z","closed_at":"2026-06-04T18:45:52Z","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"jolt-4z9","title":"HIGH: dispatch — multimethod :default, protocol-on-record, extend-protocol","status":"closed","priority":2,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-06-04T18:09:57Z","created_by":"Yogthos","updated_at":"2026-06-04T18:40:43Z","closed_at":"2026-06-04T18:40:43Z","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"jolt-40n","title":"HIGH: update/update-in/assoc-in fail on map literals (struct)","status":"closed","priority":2,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-06-04T18:09:56Z","created_by":"Yogthos","updated_at":"2026-06-04T18:40:42Z","closed_at":"2026-06-04T18:40:42Z","dependency_count":0,"dependent_count":0,"comment_count":0} diff --git a/src/jolt/config.janet b/src/jolt/config.janet new file mode 100644 index 0000000..f4e6a11 --- /dev/null +++ b/src/jolt/config.janet @@ -0,0 +1,15 @@ +# Build-time collection mode. +# +# Jolt can be built with either immutable (persistent) collections — proper +# Clojure value semantics — or fast Janet-native mutable collections. +# +# jpm build # immutable (default) +# JOLT_MUTABLE=1 jpm build # mutable +# +# This reads the environment at module-load time, so for a jpm-compiled +# executable the value is fixed when the binary is built (a true compile flag). +# `mutable?` is a constant, so the type-mode branches throughout core fold away. +(def mutable? (= "1" (os/getenv "JOLT_MUTABLE"))) + +# Convenience: immutable? is the default. +(def immutable? (not mutable?)) diff --git a/src/jolt/core.janet b/src/jolt/core.janet index 4645ea3..7d7bf66 100644 --- a/src/jolt/core.janet +++ b/src/jolt/core.janet @@ -4,6 +4,7 @@ (use ./types) (use ./phm) (use ./regex) +(use ./config) # ============================================================ # Predicates @@ -195,7 +196,8 @@ (tuple/slice (tuple ;(array/concat (array/slice coll) xs))) (if (array? coll) (do - (var result coll) + # lists prepend; copy first unless built in mutable mode + (var result (if mutable? coll (array/slice coll))) (var i 0) (while (< i (length xs)) (set result (array/insert result 0 (xs i)))