feat: build-time mutable/immutable collection toggle + fix list mutation
Add src/jolt/config.janet exposing a build-time `mutable?` constant read from JOLT_MUTABLE at compile time (jpm build). Default is immutable. Fix correctness bug: conj on a list (Janet array) mutated the original in place. In immutable mode conj now copies first; in mutable mode it mutates. Round 1 of persistent-collections work.
This commit is contained in:
parent
96e23c5235
commit
1ca93d61c6
3 changed files with 19 additions and 1 deletions
|
|
@ -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}
|
||||
|
|
|
|||
15
src/jolt/config.janet
Normal file
15
src/jolt/config.janet
Normal file
|
|
@ -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?))
|
||||
|
|
@ -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)))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue