diff --git a/src/emitter.nim b/src/emitter.nim index 2982f3c..8d0f21e 100644 --- a/src/emitter.nim +++ b/src/emitter.nim @@ -1,5 +1,5 @@ # Bara Lang → Nim Emitter -import strutils, sets, algorithm, sequtils +import strutils, sets, algorithm, sequtils, tables import types import macros @@ -10,13 +10,38 @@ var nsAliases*: seq[(string, string)] = @[] # (alias, namespace) var scopeStack*: seq[HashSet[string]] = @[] var definedGlobals*: HashSet[string] = initHashSet[string]() var multiArityFns*: HashSet[string] = initHashSet[string]() +var definedFnArities*: Table[string, int] = initTable[string, int]() # -1 = multi-arity/rest var loopResultVar*: string = "" # Set by loop handler when result capture is needed proc registerGlobal*(name: string) = definedGlobals.incl(name) +proc mangleName*(name: string): string + +proc registerFn*(name: string, arity: int) = + definedFnArities[name] = arity + +proc emitFnWrapper*(name: string): string = + ## Emit a cljFn wrapper for a user-defined function when used as a value. + let mangled = mangleName(name) + if name in multiArityFns: + # Multi-arity / rest params already take seq[CljVal] + return "cljFn(" & mangled & ")" + elif definedFnArities.hasKey(name): + let arity = definedFnArities[name] + if arity == 0: + return "cljFn(proc(args: seq[CljVal]): CljVal = " & mangled & "())" + else: + var argRefs: seq[string] = @[] + for i in 0..