all repos — min @ 1db4de1a4077ff7a7d9374dbd497e118dbaf808e

A small but practical concatenative programming language.

Added "minUnknown" symbol kind (minly used for getSymbol)
h3rald h3rald@h3rald.com
Fri, 22 May 2026 15:10:26 +0200
commit

1db4de1a4077ff7a7d9374dbd497e118dbaf808e

parent

4c8c517a9b60705b0d0fc859d77d098d3def99a5

M minpkg/core/interpreter.nimminpkg/core/interpreter.nim

@@ -279,7 +279,7 @@ if symbol == "return":

raise MinReturnException(msg: "return symbol found") i.debug("push: $#" % [symbol]) let op = i.scope.getSymbol(symbol) - if not op.isNull: + if not op.isUnknown: i.debug("push: symbol found: $#" % [symbol]) i.apply op, symbol else:

@@ -288,7 +288,7 @@ if symbol.len > 1 and symbol[symbol.len-1] == '!':

i.debug("push - checking auto-popping symbol: $#" % [symbol]) let apSymbol = symbol[0..symbol.len-2] let apOp = i.scope.getSymbol(apSymbol) - if not apOp.isNull: + if not apOp.isUnknown: i.apply apOp discard i.pop else:
M minpkg/core/parser.nimminpkg/core/parser.nim

@@ -45,6 +45,7 @@ minDictionary,

minString, minSymbol, minNull, + minUnknown, minBool MinEventKind* = enum ## enumeration of all events that may occur when parsing eMinError, ## an error ocurred during parsing

@@ -83,6 +84,7 @@ filename*: string

outerSym*: string docComment*: string case kind*: MinKind + of minUnknown: discard of minNull: discard of minInt: intVal*: BiggestInt of minFloat: floatVal*: BiggestFloat

@@ -605,7 +607,7 @@ else: raiseParsing(p, tokToStr[token])

proc `$`*(a: MinValue): string {.inline.} = case a.kind: - of minNull: + of minNull, minUnknown: return "null" of minBool: return $a.boolVal

@@ -655,7 +657,7 @@ return "[" & a.cmdVal & "]"

proc `$$`*(a: MinValue): string {.inline.} = case a.kind: - of minNull: + of minNull, minUnknown: return "null" of minBool: return $a.boolVal

@@ -891,6 +893,9 @@ stdout.flushFile()

# Predicates +proc isUnknown*(s: MinValue): bool = + return s.kind == minUnknown + proc isNull*(s: MinValue): bool = return s.kind == minNull

@@ -1016,6 +1021,9 @@

proc isNull*(op: MinOperator): bool = return op.kind == minValOp and op.val.kind == minNull +proc isUnknown*(op: MinOperator): bool = + return op.kind == minValOp and op.val.kind == minUnknown + proc getSymbol*(scope: ref MinScope, key: string): MinOperator = debug "getSymbol: $#" % [key] if scope.symbols.hasKey(key):

@@ -1026,7 +1034,7 @@ return getSymbolFromPath(scope, keys)

else: if scope.parent.isNil: debug("Unable to retrieve symbol '$1' (not found)." % key) - return MinOperator(kind: minValOp, val: MinValue(kind: minNull)) + return MinOperator(kind: minValOp, val: MinValue(kind: minUnknown)) return scope.parent.getSymbol(key) proc getSymbolFromPath(scope: ref MinScope, keys: var seq[string]): MinOperator =
M minpkg/core/shell.nimminpkg/core/shell.nim

@@ -130,7 +130,7 @@ p(part["value"].getStr, fgCyan)

proc pv(i:In, item: MinValue) = case item.kind - of minNull, minBool, minFloat, minInt: + of minNull, minBool, minFloat, minInt, minUnknown: p($item, fgGreen) of minSymbol: i.printSymbol($item)
M minpkg/core/utils.nimminpkg/core/utils.nim

@@ -127,7 +127,7 @@ proc `%`*(i: In, a: MinValue): JsonNode =

case a.kind: of minBool: return %a.boolVal - of minNull: + of minNull, minUnknown: return newJNull() of minSymbol: return %(";sym:$1" % [a.getstring])

@@ -251,11 +251,11 @@ if split[0] == "dict":

if value.isTypedDictionary(split[1]): return true return false - elif not taSym.isNull: + elif not taSym.isUnknown: # Custom type alias let element = taSym.val.getString return i.validateValueType(element, value) - elif not i.scope.getSymbol(tc).isNull: + elif not i.scope.getSymbol(tc).isUnknown: # Custom type class var i2 = i.copy(i.filename) i2.withScope():

@@ -288,7 +288,7 @@ const ts = ["bool", "null", "int", "num", "flt", "quot", "dict", "'sym",

"sym", "str", "a"] if ts.contains(s): return true - if not i.scope.getSymbol("typeclass:$#" % s).isNull: + if not i.scope.getSymbol("typeclass:$#" % s).isUnknown: return true for ta in s.split("|"): for to in ta.split("&"):

@@ -298,10 +298,10 @@ return false

if to[0] == '!': tt = to[1..to.len-1] if not ts.contains(tt) and not tt.startsWith("dict:") and - i.scope.getSymbol("typeclass:$#" % tt).isNull: + i.scope.getSymbol("typeclass:$#" % tt).isUnknown: let ta = "typealias:$#" % tt let taSym = i.scope.getSymbol(ta) - if not taSym.isNull: + if not taSym.isUnknown: return i.validType(taSym.val.getString) return false return true
M minpkg/core/value.nimminpkg/core/value.nim

@@ -21,7 +21,7 @@ of minString:

return "str" of minSymbol: return "sym" - of minNull: + of minNull, minUnknown: return "null" of minBool: return "bool"
M minpkg/lib/min_global.nimminpkg/lib/min_global.nim

@@ -350,7 +350,7 @@ var iv = inVals[k]

i.scope.symbols[inVars[k]] = MinOperator(kind: minValOp, sealed: false, val: iv) # Inject variables for mapped outputs for k in 0..outVars.len-1: - i.scope.symbols[outVars[k]] = MinOperator(kind: minValOp, sealed: false, val: @[newNull()].newVal) + i.scope.symbols[outVars[k]] = MinOperator(kind: minValOp, sealed: false, val: newNull()) # Actually execute the body of the operator if DEV: var endSnapshot: seq[MinValue]

@@ -405,7 +405,7 @@ doc["description"] = %i.currSym.docComment.strip

if ["symbol", "typeclass", "constructor"].contains(t): if i.scope.symbols.hasKey(n) and i.scope.symbols[n].sealed: raiseUndefined("Attempting to redefine sealed symbol '$1'" % [n]) - i.scope.symbols[n] = MinOperator(kind: minProcOp, prc: p, sealed: false, doc: doc) + i.scope.symbols[n] = MinOperator(kind: minProcOp, prc: p, sealed: false, doc: doc, lambda: true) else: if i.scope.sigils.hasKey(n) and i.scope.sigils[n].sealed: raiseUndefined("Attempting to redefine sealed sigil '$1'" % [n])

@@ -452,7 +452,7 @@ i.push q.newVal

def.symbol("defined-symbol?") do (i: In): let vals = i.expect("'sym") - i.push((not i.scope.getSymbol(vals[0].getString).isNull).newVal) + i.push((not i.scope.getSymbol(vals[0].getString).isUnknown).newVal) def.symbol("defined-sigil?") do (i: In): let vals = i.expect("'sym")

@@ -656,7 +656,7 @@ def.symbol("symbol-help") do (i: In):

let vals = i.expect("'sym") let s = vals[0].getString let sym = i.scope.getSymbol(s) - if not sym.isNull: + if not sym.isUnknown: if not sym.doc.isNil and sym.doc.kind == JObject: var doc = i.fromJson(sym.doc) doc.objType = "help"

@@ -709,7 +709,7 @@ for l in lines:

echo " " & l echo "===" let sym = i.scope.getSymbol(s) - if not sym.isNull: + if not sym.isUnknown: found = true if not sym.doc.isNil and sym.doc.kind == JObject: foundDoc = true