commit 7b8cd20ca0804b40f3621fea353739f8214c8055
parent 5cbae63c67263f473fbfb7a5ec45e0d11a144c12
Author: bsandro <email@bsandro.tech>
Date:   Thu, 23 Jun 2022 22:54:32 +0300
eval boolean
Diffstat:
3 files changed, 53 insertions(+), 6 deletions(-)
diff --git a/eval/eval.go b/eval/eval.go
@@ -5,6 +5,12 @@ import (
 	"interp/object"
 )
 
+var (
+	TRUE  = &object.Boolean{Value: true}
+	FALSE = &object.Boolean{Value: false}
+	NULL  = &object.Null{}
+)
+
 func Eval(node ast.Node) object.Object {
 	switch node := node.(type) {
 	case *ast.Program:
@@ -13,14 +19,24 @@ func Eval(node ast.Node) object.Object {
 		return Eval(node.Expression)
 	case *ast.IntegerLiteral:
 		return &object.Integer{Value: node.Value}
+	case *ast.Boolean:
+		return nativeBoolToBooleanObject(node.Value)
 	}
 	return nil
 }
 
 func evalStatements(statements []ast.Statement) object.Object {
 	var result object.Object
-	for _,statement := range statements {
+	for _, statement := range statements {
 		result = Eval(statement)
 	}
 	return result
 }
+
+func nativeBoolToBooleanObject(input bool) *object.Boolean {
+	if input {
+		return TRUE
+	} else {
+		return FALSE
+	}
+}
diff --git a/eval/eval_test.go b/eval/eval_test.go
@@ -2,14 +2,14 @@ package eval
 
 import (
 	"interp/lexer"
-	"interp/parser"
 	"interp/object"
+	"interp/parser"
 	"testing"
 )
 
 func TestEvalIntegerExpression(t *testing.T) {
-	tests := []struct{
-		input string
+	tests := []struct {
+		input    string
 		expected int64
 	}{
 		{"6", 6},
@@ -40,3 +40,30 @@ func testIntegerObject(t *testing.T, obj object.Object, expected int64) bool {
 	}
 	return true
 }
+
+func TestEvalBooleanExpression(t *testing.T) {
+	tests := []struct {
+		input    string
+		expected bool
+	}{
+		{"true", true},
+		{"false", false},
+	}
+	for _, tt := range tests {
+		evaluated := testEval(tt.input)
+		testBooleanObject(t, evaluated, tt.expected)
+	}
+}
+
+func testBooleanObject(t *testing.T, obj object.Object, expected bool) bool {
+	result, ok := obj.(*object.Boolean)
+	if !ok {
+		t.Errorf("obj is not boolean (%T %+v)", obj, obj)
+		return false
+	}
+	if result.Value != expected {
+		t.Errorf("obj has wrong value (%t instead of %t)", result.Value, expected)
+		return false
+	}
+	return true
+}
diff --git a/repl/repl.go b/repl/repl.go
@@ -3,6 +3,7 @@ package repl
 import (
 	"bufio"
 	"fmt"
+	"interp/eval"
 	"interp/lexer"
 	"interp/parser"
 	"io"
@@ -26,8 +27,11 @@ func Start(in io.Reader, out io.Writer) {
 		if len(p.Errors()) != 0 {
 			printParserErrors(out, p.Errors())
 		}
-		io.WriteString(out, prg.String())
-		io.WriteString(out, "\n")
+		evaluated := eval.Eval(prg)
+		if evaluated != nil {
+			io.WriteString(out, evaluated.Inspect())
+			io.WriteString(out, "\n")
+		}
 	}
 }