feat: +13 tests (184/233, 79%) — case, hex/radix, protocol/record stubs, doseq destructuring

This commit is contained in:
2026-05-09 19:53:08 +03:00
parent 0ba94881be
commit 6633c3708d
6 changed files with 412 additions and 59 deletions
+63 -6
View File
@@ -180,6 +180,8 @@ proc cljIsSeq*(v: CljVal): CljVal = cljBool(not cljIsNil(v) and v.kind in {ckLis
proc cljIsColl*(v: CljVal): CljVal = cljBool(not cljIsNil(v) and v.kind in {ckList, ckVector, ckMap, ckSet})
proc cljIsSequential*(v: CljVal): CljVal = cljBool(not cljIsNil(v) and v.kind in {ckList, ckVector})
proc cljIsFn*(v: CljVal): CljVal = cljBool(not cljIsNil(v) and v.kind == ckFn)
proc cljIsVar*(v: CljVal): CljVal = cljBool(false)
proc cljIsIfn*(v: CljVal): CljVal = cljBool(not cljIsNil(v) and v.kind in {ckFn, ckKeyword, ckSymbol, ckMap, ckSet, ckVector})
proc cljIsBool*(v: CljVal): CljVal = cljBool(not cljIsNil(v) and v.kind == ckBool)
proc cljIsTrueP*(v: CljVal): CljVal = cljBool(cljIsTrue(v))
proc cljIsFalseP*(v: CljVal): CljVal = cljBool(cljIsFalse(v))
@@ -866,6 +868,51 @@ proc cljUnderive*(args: seq[CljVal]): CljVal =
if args.len < 3: return cljNil()
args[0]
proc cljAncestors*(args: seq[CljVal]): CljVal =
if args.len < 1: return cljNil()
cljSet(@[])
proc cljDescendants*(args: seq[CljVal]): CljVal =
if args.len < 1: return cljNil()
cljSet(@[])
proc cljParents*(args: seq[CljVal]): CljVal =
if args.len < 1: return cljNil()
cljSet(@[])
proc cljIsa*(args: seq[CljVal]): CljVal =
if args.len < 2: return cljBool(false)
cljBool(cljIsNil(args[0]) == false and cljIsNil(args[1]) == false)
proc cljBoundFn*(p: proc(args: seq[CljVal]): CljVal): CljVal =
cljFn(p)
proc cljVar*(v: CljVal): CljVal =
if v.kind == ckString: return cljString(v.strVal)
v
proc cljProtocol*(name: string): CljVal =
cljKeyword(name)
proc cljRecord*(name: string, fields: CljVal): CljVal =
cljKeyword(name)
proc cljTypeConstructor*(name: string, fields: CljVal): CljVal =
cljKeyword(name)
proc cljMultiFn*(name: string, dispatchFn: CljVal): CljVal =
cljFn(proc(args: seq[CljVal]): CljVal = cljNil())
proc cljCreateNs*(args: seq[CljVal]): CljVal =
cljNil()
proc cljMultiEqual2*(a, b: CljVal): CljVal =
cljMultiEqual(@[a, b])
proc cljOr2*(a, b: CljVal): CljVal =
if cljIsTruthy(a): a
else: b
proc cljPrintlnStr*(args: seq[CljVal]): CljVal =
var parts: seq[string] = @[]
for a in args:
@@ -979,18 +1026,22 @@ proc cljRandomSample*(args: seq[CljVal]): CljVal =
items.add(item)
cljList(items)
proc cljTake*(n: int, coll: CljVal): CljVal =
proc cljTake*(n: CljVal, coll: CljVal): CljVal =
if n.kind != ckInt: raise newException(CatchableError, "take requires an integer")
let count = n.intVal.int
if coll.isNil: return cljList(@[])
case coll.kind
of ckList: cljList(coll.listItems[0..<min(n, coll.listItems.len)])
of ckVector: cljList(toSeq(coll.vecData)[0..<min(n, coll.vecData.count)])
of ckList: cljList(coll.listItems[0..<min(count, coll.listItems.len)])
of ckVector: cljList(toSeq(coll.vecData)[0..<min(count, coll.vecData.count)])
else: cljList(@[])
proc cljDrop*(n: int, coll: CljVal): CljVal =
proc cljDrop*(n: CljVal, coll: CljVal): CljVal =
if n.kind != ckInt: raise newException(CatchableError, "drop requires an integer")
let count = n.intVal.int
if coll.isNil: return cljList(@[])
case coll.kind
of ckList: cljList(coll.listItems[min(n, coll.listItems.len)..^1])
of ckVector: cljList(toSeq(coll.vecData)[min(n, coll.vecData.count)..^1])
of ckList: cljList(coll.listItems[min(count, coll.listItems.len)..^1])
of ckVector: cljList(toSeq(coll.vecData)[min(count, coll.vecData.count)..^1])
else: cljList(@[])
proc cljReverse*(coll: CljVal): CljVal =
@@ -1453,6 +1504,12 @@ proc cljWithMeta*(v: CljVal, m: CljVal): CljVal =
proc cljAtom*(v: CljVal): CljVal =
CljVal(kind: ckAtom, atomVal: v)
proc cljPromise*(args: seq[CljVal]): CljVal =
cljAtom(cljNil())
proc cljFuture*(args: seq[CljVal]): CljVal =
cljAtom(cljNil())
proc cljDeref*(a: CljVal): CljVal =
if a.kind == ckAtom: a.atomVal
elif a.kind == ckAgent: a.agentVal