I'm pretty new to Nim.
I have this code:
type
Environment* = object
values*: Table[string, BaseType]
error*: Error
proc newEnv*(errorObj: Error): Environment =
return Environment(
values: initTable[string, BaseType](),
error: errorObj
)
proc define*(env: var Environment, name: string, value: BaseType) =
env.values[name] = value
echo(env.values)
proc get*(env: var Environment, name: Token): BaseType =
echo(env.values)
if env.values.hasKey(name.value):
return env.values[name.value]
else:
# do something...
type Interpreter* = object
error*: Error
env*: Environment
proc newInterpreter*(errorObj: Error): Interpreter =
return Interpreter(
error: errorObj,
env: newEnv(errorObj)
)
method eval*(self: var Interpreter, expre: Expr): BaseType {.base.} = discard
method eval*(self: var Interpreter, statement: Stmt) {.base.} = discard
method eval*(self: var Interpreter, expre: VariableExpr): BaseType =
return self.env.get(expre.name)
method eval*(self: var Interpreter, statement: VariableStmt) =
var value: BaseType
if not statement.init.isNil: value = self.eval(statement.init)
self.env.define(statement.name.value, value)
As you can see, when eval
proc with VariableStmt
is called, it calls define
proc to bind the name with the value.
However, the two echo statements print this:
{"a": 123}
{:}
The first line is from define
proc, and the second line is from get
proc.
Even though it looks like "a"
and 123
got saved from calling define
proc, inside get
proc, the values
table is empty.
I am not sure why this is. Could you help me solve this?
I will provide more information if you need it.
Update
I put an echo statement just before return self.env.get(expre.name)
, and it prints out this:
(data: @[(hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil), (hcode: 0, key: "", val: nil)], counter: 0)
I'm not sure what this is. Is it a bug of Nim?