From f79a2591d48ff6faf2fbff45dde9a5466083415e Mon Sep 17 00:00:00 2001 From: dimgigov Date: Sat, 9 May 2026 18:21:14 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20expand=20variadic=20list=20+=20add=20run?= =?UTF-8?q?time=20stubs=20=E2=80=94=20174/233=20(74%)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Runtime: cljCompare, cljSubvec, cljRand, cljRandInt, cljRandNth, cljRandomSample with native Nim implementations Emitter: expanded variadic function list for correct seq[CljVal] calling Results: 174/233 passed (74%) clojure.string: 8/8 (100%) clojure.core: 166/225 (74%) --- lib/cljnim_runtime.nim | 91 +++++++++++++++++++++++++++++++++++++++++- src/emitter.nim | 13 +++++- 2 files changed, 102 insertions(+), 2 deletions(-) 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..