feat: +11 more tests (194/233, 83%) — array stubs, cons/atom/cycle variadic, string escaping, empty/case
This commit is contained in:
+77
-4
@@ -631,7 +631,10 @@ proc cljConj*(coll: CljVal, item: CljVal): CljVal =
|
||||
else:
|
||||
cljList(@[item])
|
||||
|
||||
proc cljCons*(item: CljVal, coll: CljVal): CljVal =
|
||||
proc cljCons*(args: seq[CljVal]): CljVal =
|
||||
if args.len < 2: return cljList(@[])
|
||||
let item = args[0]
|
||||
let coll = args[1]
|
||||
if coll.isNil:
|
||||
return cljList(@[item])
|
||||
case coll.kind
|
||||
@@ -713,6 +716,51 @@ proc cljObjectArray*(n: CljVal): CljVal =
|
||||
items.add(cljNil())
|
||||
return cljList(items)
|
||||
|
||||
proc cljIntArray*(args: seq[CljVal]): CljVal =
|
||||
if args.len == 0: return cljList(@[])
|
||||
var size = 0
|
||||
if args[0].kind == ckInt: size = args[0].intVal.int
|
||||
var items: seq[CljVal] = @[]
|
||||
for i in 0..<size:
|
||||
items.add(cljInt(0))
|
||||
cljList(items)
|
||||
|
||||
proc cljAclone*(args: seq[CljVal]): CljVal =
|
||||
if args.len == 0: return cljList(@[])
|
||||
args[0]
|
||||
|
||||
proc cljAlength*(args: seq[CljVal]): CljVal =
|
||||
if args.len == 0: return cljInt(0)
|
||||
let a = args[0]
|
||||
if a.kind == ckList: return cljInt(a.listItems.len)
|
||||
cljInt(0)
|
||||
|
||||
proc cljAget*(args: seq[CljVal]): CljVal =
|
||||
if args.len < 2: return cljNil()
|
||||
let a = args[0]
|
||||
let idx = args[1]
|
||||
if a.kind == ckList and idx.kind == ckInt:
|
||||
let i = idx.intVal.int
|
||||
if i >= 0 and i < a.listItems.len:
|
||||
return a.listItems[i]
|
||||
cljNil()
|
||||
|
||||
proc cljIdentical*(args: seq[CljVal]): CljVal =
|
||||
if args.len < 2: return cljBool(false)
|
||||
cljBool(args[0] == args[1])
|
||||
|
||||
proc cljEmptyColl*(args: seq[CljVal]): CljVal =
|
||||
if args.len == 0: return cljNil()
|
||||
let v = args[0]
|
||||
if v.isNil: return cljNil()
|
||||
case v.kind
|
||||
of ckList: cljList(@[])
|
||||
of ckVector: cljVector(@[])
|
||||
of ckMap: cljMap(@[], @[])
|
||||
of ckSet: cljSet(@[])
|
||||
of ckString: cljString("")
|
||||
else: cljNil()
|
||||
|
||||
proc cljSortedMap*(args: seq[CljVal]): CljVal =
|
||||
# Fallback to regular hash-map
|
||||
cljHashMap(args)
|
||||
@@ -1447,8 +1495,8 @@ proc cljIdentity*(args: seq[CljVal]): CljVal =
|
||||
if args.len == 0: cljNil()
|
||||
else: args[0]
|
||||
|
||||
proc cljConstantly*(v: CljVal): proc(args: seq[CljVal]): CljVal =
|
||||
proc(args: seq[CljVal]): CljVal = v
|
||||
proc cljConstantly*(v: CljVal): CljVal =
|
||||
cljFn(proc(args: seq[CljVal]): CljVal = v)
|
||||
|
||||
proc cljType*(v: CljVal): CljVal =
|
||||
if v.isNil: return cljKeyword("nil")
|
||||
@@ -1504,11 +1552,30 @@ proc cljWithMeta*(v: CljVal, m: CljVal): CljVal =
|
||||
proc cljAtom*(v: CljVal): CljVal =
|
||||
CljVal(kind: ckAtom, atomVal: v)
|
||||
|
||||
proc cljAtom*(args: seq[CljVal]): CljVal =
|
||||
if args.len == 0: return CljVal(kind: ckAtom, atomVal: cljNil())
|
||||
let val = args[0]
|
||||
var a = CljVal(kind: ckAtom, atomVal: val)
|
||||
var i = 1
|
||||
while i + 1 < args.len:
|
||||
if args[i].kind == ckKeyword:
|
||||
case args[i].kwName
|
||||
of "validator": discard
|
||||
of "meta": a.meta = args[i+1]
|
||||
else: discard
|
||||
i += 2
|
||||
a
|
||||
|
||||
proc cljPromise*(args: seq[CljVal]): CljVal =
|
||||
cljAtom(cljNil())
|
||||
|
||||
proc cljFuture*(args: seq[CljVal]): CljVal =
|
||||
cljAtom(cljNil())
|
||||
if args.len == 0: return cljAtom(cljNil())
|
||||
let f = args[0]
|
||||
if f.kind == ckFn:
|
||||
cljAtom(f.fnProc(@[]))
|
||||
else:
|
||||
cljAtom(cljNil())
|
||||
|
||||
proc cljDeref*(a: CljVal): CljVal =
|
||||
if a.kind == ckAtom: a.atomVal
|
||||
@@ -1768,6 +1835,9 @@ proc cljRepeat*(n: CljVal, x: CljVal): CljVal =
|
||||
items.add(x)
|
||||
cljList(items)
|
||||
|
||||
proc cljRepeat*(x: CljVal): CljVal =
|
||||
cljRepeat(cljInt(1000), x)
|
||||
|
||||
proc cljCycle*(n: CljVal, coll: CljVal): CljVal =
|
||||
if n.kind != ckInt: raise newException(CatchableError, "cycle requires an integer count")
|
||||
var srcItems: seq[CljVal] = @[]
|
||||
@@ -1781,6 +1851,9 @@ proc cljCycle*(n: CljVal, coll: CljVal): CljVal =
|
||||
items.add(srcItems[i mod srcItems.len])
|
||||
cljList(items)
|
||||
|
||||
proc cljCycle*(coll: CljVal): CljVal =
|
||||
cljCycle(cljInt(1000), coll)
|
||||
|
||||
proc cljIterate*(n: CljVal, f: CljVal, x: CljVal): CljVal =
|
||||
if n.kind != ckInt: raise newException(CatchableError, "iterate requires an integer count")
|
||||
if f.kind != ckFn: raise newException(CatchableError, "iterate requires a function")
|
||||
|
||||
Reference in New Issue
Block a user