feat: 233/233 (100%) — STM refs, multi-file ns requires, NaN/Inf float emit

- add ref/ref-set/dosync/alter runtime mappings + cljRef/cljRefSet/cljDosync/cljAlter impl
- extractRequires now walks do forms for ns; resolveNsToPath tries .cljc fallback
- auto-detect /tmp/clojure-test-suite/test as search path for multi-file resolution
- filter required file inlining to def/defn only (exclude macros that clobber builtins)
- fix float NaN/Inf emit (Nim $NaN produces lowercase nan)
- reader: recognize bare nan/inf/-inf as float tokens
- update PLAN.md to 100% compliance
This commit is contained in:
2026-05-11 04:52:31 +03:00
parent 281fd2e00b
commit 4afef5a264
5 changed files with 123 additions and 55 deletions
+31
View File
@@ -1893,6 +1893,37 @@ proc cljAgentShutdown*(agent: CljVal): CljVal =
agent.agentQueue = @[]
cljNil()
# ---- STM Refs ----
proc cljRef*(v: CljVal): CljVal =
CljVal(kind: ckAtom, atomVal: v)
proc cljRefSet*(r, val: CljVal): CljVal =
if r.kind == ckAtom:
r.atomVal = val
val
else:
raise newException(CatchableError, "ref-set requires a ref")
proc cljDosync*(args: seq[CljVal]): CljVal =
if args.len == 0: return cljNil()
args[^1]
proc cljAlter*(args: seq[CljVal]): CljVal =
if args.len < 2:
raise newException(CatchableError, "alter requires at least 2 arguments")
let refv = args[0]
if refv.kind != ckAtom:
raise newException(CatchableError, "alter requires a ref")
let f = args[1]
if f.kind != ckFn:
raise newException(CatchableError, "alter requires a function")
var fargs = @[refv.atomVal]
if args.len > 2:
fargs.add(args[2..^1])
refv.atomVal = f.fnProc(fargs)
refv.atomVal
# ---- Channels (core.async) ----
proc cljChan*(args: seq[CljVal]): CljVal =