Updated objects (unable to execute tests).
@@ -46,7 +46,7 @@ return MinValue(kind: minSymbol, symVal: sym.outerSym, filename: sym.filename,
line: sym.line, column: sym.column, outerSym: "", docComment: sym.docComment) -proc raiseRuntime*(msg: string, data: MinValue) = +proc raiseRuntime*(msg: string, data: var MinValue) = data.objType = "error" raise MinRuntimeError(msg: msg, data: data)@@ -194,7 +194,7 @@ return v
proc apply*(i: In, op: MinOperator, sym = "") {.gcsafe, effectsOf: op.} = if op.kind == minProcOp: - if not op.mdl.isNil and not op.mdl.scope.isNil and not i.scope.hasParent op.mdl.scope: + if not op.mdl.scope.isNil and not i.scope.hasParent op.mdl.scope: # Capture closures at module level let origScope = i.scope let origParentScope = i.scope.parent@@ -364,7 +364,7 @@ if i.trace.len == 0:
i.stackcopy = i.stack handleErrors(i) do: val = i.parser.parseMinValue(i) - if not val.isNil: + if not val.isUnknown: if parseOnly: q.qVal.add val else:@@ -420,7 +420,7 @@ i.stackcopy = i2.stackcopy
i.stack = i2.stack i.scope = i2.scope -proc load*(i: In, s: string, parseOnly = false): MinValue {.discardable.} = +proc load*(i: In, s: string, parseOnly = false): MinValue {.discardable, gcsafe.} = var fileLines = newSeq[string](0) var contents = "" try:
@@ -76,7 +76,7 @@ token*: MinTokenKind
kind*: MinEventKind err*: MinParserError filename*: string - MinValue* = ref MinValueObject + MinValue* = MinValueObject MinValueObject* {.acyclic, final.} = object line*: int column*: int@@ -455,7 +455,7 @@ inc(pos)
my.bufpos = pos proc addDoc(my: var MinParser, docComment: string, reset = true) = - if my.doc and not my.currSym.isNil and my.currSym.kind == minSymbol: + if my.doc and my.currSym.kind == minSymbol: if reset: my.doc = false if my.currSym.docComment.len == 0 or my.currSym.docComment.len > 0 and@@ -707,6 +707,8 @@ return d
proc setSymbol*(scope: ref MinScope, key: string, value: MinOperator, override = false, define = false): bool {.discardable, gcsafe.} +proc isUnknown*(s: MinValue): bool {.gcsafe.} + proc parseMinValue*(p: var MinParser, i: In): MinValue = case p.token of tkNull:@@ -753,7 +755,7 @@ var q = newSeq[MinValue](0)
discard getToken(p) while p.token != tkBracketRi: let v = p.parseMinValue(i) - if not v.isNil: + if not v.isUnknown: q.add v eat(p, tkBracketRi) result = MinValue(kind: minQuotation, qVal: q)@@ -764,10 +766,10 @@ discard getToken(p)
var c = 0 while p.token != tkBraceRi: let v = p.parseMinValue(i) - if v.isNil: + if v.isUnknown: continue c = c+1 - if val.isNil: + if val.isUnknown: val = v elif v.kind == minSymbol: let key = v.symVal@@ -776,7 +778,7 @@ var offset = 0
if key[1] == '"': offset = 1 scope.symbols[key[1+offset .. key.len-1-offset]] = MinOperator(kind: minValOp, val: val, sealed: false, lambda: key[0] == '^') - val = nil + val = MinValue(kind: minUnknown) else: raiseInvalid("Invalid dictionary key: " & key) else:@@ -793,12 +795,11 @@ p.currSym = result
discard getToken(p) of tkLineComment, tkBlockComment, tkLineDocComment, tkBlockDocComment, tkSpace: eat(p, p.token) - result = nil #p.parseMinValue(i) - #discard getToken(p) + result = MinValue(kind: minUnknown) else: let err = "Undefined or invalid value (" & $p.token & "): " & p.a raiseUndefined(p, err) - if not result.isNil: + if not result.isUnknown: result.filename = p.filename proc compileMinValue*(p: var MinParser, i: In, push = true, indent = ""): seq[string] =@@ -854,10 +855,10 @@ var dictvar = "dict" & $CVARCOUNT
result.add indent&"var $# = newDict(i.scope)" % [dictvar] while p.token != tkBraceRi: let v = p.parseMinValue(i) - if v.isNil: + if v.isUnknown: continue c = c+1 - if val.isNil: + if val.isUnknown: val = v elif v.kind == minSymbol: let key = v.symVal@@ -865,7 +866,7 @@ if key[0] == ':' or key[0] == '^':
let isLambda = key[0] == '^' let symkey = key[1 .. key.len-1] result.add "i.dset($#, \"$#\", $#.newVal, lambda: $#)" % [dictvar, symkey, $val, $isLambda] - val = nil + val = MinValue(kind: minUnknown) else: raiseInvalid("Invalid dictionary key: " & key) else:@@ -881,8 +882,6 @@ discard getToken(p)
of tkLineComment, tkBlockComment, tkLineDocComment, tkBlockDocComment, tkSpace: eat(p, p.token) result = @[""] - #discard getToken(p) - #result = p.compileMinValue(i, push, indent) else: raiseUndefined(p, "Undefined value: '"&p.a&"'")@@ -1013,6 +1012,8 @@ 1 and d.val.qVal[0].kind == minDictionary:
return d.val.qVal[0] elif d.kind == minValOp and d.val.kind == minDictionary: return d.val + else: + return MinValue(kind: minUnknown) proc getSymbolFromPath(scope: ref MinScope, keys: var seq[string]): MinOperator {.gcsafe.}@@ -1040,7 +1041,7 @@ let sym = keys[0]
keys.delete(0) let d = scope.getSymbol(sym) let dict = d.getDictionary - if not dict.isNil: + if dict.isDictionary: if keys.len > 1: return dict.scope.getSymbolFromPath(keys) else:@@ -1067,7 +1068,7 @@ let sym = keys[0]
keys.delete(0) let d = scope.getSymbol(sym) let dict = d.getDictionary - if not dict.isNil: + if dict.isDictionary: if keys.len > 1: return dict.scope.delSymbolFromPath(keys) else:@@ -1108,7 +1109,7 @@ keys.delete(0)
let d = scope.getSymbol(sym) let dict = d.getDictionary debug "setSymbolFromPath: Found dictionary $# - keys: $#" % [sym, keys.join(".")] - if not dict.isNil: + if dict.isDictionary: if keys.len > 1: return dict.scope.setSymbolFromPath(keys, value, override, define) else:
@@ -45,24 +45,24 @@ else:
word = words[words.len-1] if word.contains("."): var op: MinOperator - var dict: MinValue + var dict: MinValue = MinValue(kind: minUnknown) var path = "" if ['?', '@', '\'', '~', '#'].contains(word[0]): path &= word[0] word = word[1..^1] let dicts = word.split(".") for d in dicts: - if dict.isNil: + if dict.isUnknown: # Not initialized yet if i.scope.symbols.hasKey(d): op = i.scope.symbols[d] - if op.kind == minProcOp and not op.mdl.isNil: + if op.kind == minProcOp and not op.mdl.isUnknown: dict = op.mdl elif op.kind == minValOp and op.val.kind == minDictionary: dict = op.val path &= d & "." elif dict.dVal.hasKey(d): op = dict.dVal[d] - if op.kind == minProcOp and not op.mdl.isNil: + if op.kind == minProcOp and not op.mdl.isUnknown: dict = op.mdl elif op.kind == minValOp and op.val.kind == minDictionary: dict = op.val@@ -160,7 +160,7 @@ i.pv(v); p(keyType & $val.key & " ", fgCyan)
p("}", fgRed) proc printResult(i: In, res: MinValue) = - if res.isNil: + if res.isUnknown: return if i.stack.len > 0: let n = $i.stack.len
@@ -780,7 +780,7 @@ raiseInvalid("Unable to display source: '$1' is an operator." % str)
def.symbol("raise") do (i: In): let vals = i.expect("dict") - let err = vals[0] + var err = vals[0] if err.dhas("error".newVal) and err.dhas("message".newVal): raiseRuntime("($1) $2" % [i.dget(err, "error".newVal).getString, i.dget(err, "message").getString], err) else: