Added "minUnknown" symbol kind (minly used for getSymbol)
@@ -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:
@@ -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 =
@@ -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)
@@ -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
@@ -21,7 +21,7 @@ of minString:
return "str" of minSymbol: return "sym" - of minNull: + of minNull, minUnknown: return "null" of minBool: return "bool"
@@ -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