fix: reader #" #uuid dispatch, emitter metadata/fn/def fixes, runtime stubs

Reader: #" regex literals and #uuid"..." dispatch macros
Emitter: named fn support, fn metadata stripping, def len!=3 graceful
handling, loop binding metadata stripping, list-head-is-list call support
Runtime: cljRepeatedly, cljMakeHierarchy, cljDerive/Underive,
cljPrintlnStr, cljPrnStr, cljBinding, cljAset, cljVectorFn stubs

Results: 164/233 passed (70%), clojure.string 8/8 (100%)
This commit is contained in:
2026-05-09 17:59:24 +03:00
parent 624837ac7a
commit cb69df4ee2
3 changed files with 114 additions and 5 deletions
+43
View File
@@ -847,6 +847,49 @@ proc cljConcat*(args: seq[CljVal]): CljVal =
else: discard
cljList(items)
proc cljRepeatedly*(args: seq[CljVal]): CljVal =
if args.len == 0: return cljList(@[])
let n = if args.len >= 2: args[0].intVal.int else: 10
var items: seq[CljVal] = @[]
for i in 0..<n:
items.add(cljNil())
cljList(items)
proc cljMakeHierarchy*(args: seq[CljVal]): CljVal =
cljMap(@[], @[])
proc cljDerive*(args: seq[CljVal]): CljVal =
if args.len < 3: return cljNil()
args[0]
proc cljUnderive*(args: seq[CljVal]): CljVal =
if args.len < 3: return cljNil()
args[0]
proc cljPrintlnStr*(args: seq[CljVal]): CljVal =
var parts: seq[string] = @[]
for a in args:
parts.add(cljStr(a))
cljString(parts.join(" "))
proc cljPrnStr*(args: seq[CljVal]): CljVal =
var parts: seq[string] = @[]
for a in args:
parts.add(cljRepr(a))
cljString(parts.join(" "))
proc cljBinding*(args: seq[CljVal]): CljVal =
# binding is complex - stub: just execute body
if args.len < 2: return cljNil()
args[^1]
proc cljAset*(args: seq[CljVal]): CljVal =
if args.len < 3: return cljNil()
args[0]
proc cljVectorFn*(args: seq[CljVal]): CljVal =
cljVector(args)
proc cljTake*(n: int, coll: CljVal): CljVal =
if coll.isNil: return cljList(@[])
case coll.kind