diff --git a/lib/cljnim_runtime.nim b/lib/cljnim_runtime.nim index e5803ab..9b91a26 100644 --- a/lib/cljnim_runtime.nim +++ b/lib/cljnim_runtime.nim @@ -1,6 +1,6 @@ import cljnim_pvec import cljnim_pmap -import strutils, sequtils, hashes, algorithm, os, osproc, locks, math +import strutils, sequtils, hashes, algorithm, os, osproc, locks, math, random type CljKind* = enum @@ -890,6 +890,95 @@ proc cljAset*(args: seq[CljVal]): CljVal = proc cljVectorFn*(args: seq[CljVal]): CljVal = cljVector(args) +proc cljCompare*(args: seq[CljVal]): CljVal = + if args.len < 2: return cljInt(0) + let a = args[0]; let b = args[1] + if a.isNil and b.isNil: return cljInt(0) + if a.isNil: return cljInt(-1) + if b.isNil: return cljInt(1) + case a.kind + of ckInt: + if b.kind == ckInt: + if a.intVal < b.intVal: return cljInt(-1) + elif a.intVal > b.intVal: return cljInt(1) + else: return cljInt(0) + elif b.kind == ckFloat: + if a.intVal.float < b.floatVal: return cljInt(-1) + elif a.intVal.float > b.floatVal: return cljInt(1) + else: return cljInt(0) + of ckFloat: + if b.kind == ckFloat: + if a.floatVal < b.floatVal: return cljInt(-1) + elif a.floatVal > b.floatVal: return cljInt(1) + else: return cljInt(0) + elif b.kind == ckInt: + if a.floatVal < b.intVal.float: return cljInt(-1) + elif a.floatVal > b.intVal.float: return cljInt(1) + else: return cljInt(0) + of ckString: + if b.kind == ckString: + if a.strVal < b.strVal: return cljInt(-1) + elif a.strVal > b.strVal: return cljInt(1) + else: return cljInt(0) + of ckKeyword: + if b.kind == ckKeyword: + if a.kwName < b.kwName: return cljInt(-1) + elif a.kwName > b.kwName: return cljInt(1) + else: return cljInt(0) + else: discard + cljInt(0) + +proc cljSubvec*(args: seq[CljVal]): CljVal = + if args.len < 2: return cljVector(@[]) + let v = args[0] + let start = args[1].intVal.int + let stop = if args.len >= 3: args[2].intVal.int else: (if v.kind == ckVector: v.vecData.count else: 0) + if v.kind != ckVector: return cljVector(@[]) + var items: seq[CljVal] = @[] + for i in start..