Prechádzať zdrojové kódy

bindings & The environment -- finished letStatement evaluator

runningwater 3 rokov pred
rodič
commit
ca74436c6e
1 zmenil súbory, kde vykonal 11 pridanie a 1 odobranie
  1. 11 1
      evaluator/evaluator.go

+ 11 - 1
evaluator/evaluator.go

@@ -52,12 +52,14 @@ func Eval(node ast.Node, env *object.Environment) object.Object {
 			return val
 		}
 		return &object.ReturnValue{Value: val}
+	case *ast.Identifier:
+		return evalIdentifier(node, env)
 	case *ast.LetStatement:
 		val := Eval(node.Value, env)
 		if isError(val) {
 			return val
 		}
-		// Huh? Now what?
+		env.Set(node.Name.Value, val)
 	}
 
 	return nil
@@ -189,6 +191,14 @@ func evalBangOperatorExpression(right object.Object) object.Object {
 	}
 }
 
+func evalIdentifier(node *ast.Identifier, env *object.Environment) object.Object {
+	val, ok := env.Get(node.Value)
+	if !ok {
+		return newError("identifier not found: " + node.Value)
+	}
+	return val
+}
+
 func isTruthy(obj object.Object) bool {
 	switch obj {
 	case NULL: