|
|
@@ -63,6 +63,7 @@ func Eval(node ast.Node, env *object.Environment) object.Object {
|
|
|
case *ast.FunctionLiteral:
|
|
|
params := node.Parameters
|
|
|
body := node.Body
|
|
|
+
|
|
|
return &object.Function{Parameters: params, Body: body, Env: env}
|
|
|
case *ast.CallExpression:
|
|
|
function := Eval(node.Function, env)
|
|
|
@@ -75,6 +76,8 @@ func Eval(node ast.Node, env *object.Environment) object.Object {
|
|
|
}
|
|
|
|
|
|
return applyFunction(function, args)
|
|
|
+ case *ast.StringLiteral:
|
|
|
+ return &object.String{Value: node.Value}
|
|
|
}
|
|
|
|
|
|
return nil
|
|
|
@@ -150,6 +153,8 @@ func evalInfixExpression(operator string, left object.Object, right object.Objec
|
|
|
switch {
|
|
|
case left.Type() == object.IntegerObj && right.Type() == object.IntegerObj:
|
|
|
return evalIntegerInfixExpression(operator, left, right)
|
|
|
+ case left.Type() == object.StringObj && right.Type() == object.StringObj:
|
|
|
+ return evalStringInfixExpression(operator, left, right)
|
|
|
case operator == "==":
|
|
|
return nativeBooleanObject(left == right)
|
|
|
case operator == "!=":
|
|
|
@@ -214,7 +219,16 @@ func evalIntegerInfixExpression(operator string,
|
|
|
return newError("unknown operator: %s %s %s", left.Type(), operator, right.Type())
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+func evalStringInfixExpression(operator string,
|
|
|
+ left object.Object, right object.Object) object.Object {
|
|
|
+ // Only identifier + is valid
|
|
|
+ if operator != "+" {
|
|
|
+ return newError("unknown operator: %s %s %s", left.Type(), operator, right.Type())
|
|
|
+ }
|
|
|
+ leftVal := left.(*object.String).Value
|
|
|
+ rightVal := right.(*object.String).Value
|
|
|
+ return &object.String{Value: leftVal + rightVal}
|
|
|
+}
|
|
|
func evalMinusPreOperatorExpression(right object.Object) object.Object {
|
|
|
if right.Type() != object.IntegerObj {
|
|
|
return newError("unknown operator: -%s", right.Type())
|