From 23e41a768baba8b1b6f009ff5811fb6040a6584a Mon Sep 17 00:00:00 2001 From: "Shea Lewis (Kai)" Date: Mon, 3 May 2021 01:23:47 -0700 Subject: [PATCH 1/2] Remove unecessary code --- evaluator/evaluator.go | 1 + examples/object.ghost | 22 ++++++++-------------- parser/parser.go | 12 ------------ 3 files changed, 9 insertions(+), 26 deletions(-) diff --git a/evaluator/evaluator.go b/evaluator/evaluator.go index 9f27000..74279c7 100644 --- a/evaluator/evaluator.go +++ b/evaluator/evaluator.go @@ -17,6 +17,7 @@ import ( // Eval evaluates the node and returns an object func Eval(node ast.Node, env *object.Environment) object.Object { + switch node := node.(type) { // Statements diff --git a/examples/object.ghost b/examples/object.ghost index 2d0db1e..9314fa5 100644 --- a/examples/object.ghost +++ b/examples/object.ghost @@ -1,19 +1,13 @@ -function Person(name, age) { - self := {} +self := {} - self.name := name - self.age := age - - self.greet := function() { - print("Hello, " + self.name + ".") - } +test := function() { + print("test!!!") +} - // self.age := function() { - // print(self.name + " is " + self.age + " years old.") - // } +test() - return self +self.test := function() { + print("test") } -person := Person("Kai", 31) -print(person.name) \ No newline at end of file +self.test() \ No newline at end of file diff --git a/parser/parser.go b/parser/parser.go index 7766357..d91cafc 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -725,10 +725,6 @@ func (p *Parser) parseAssignStatement() ast.Statement { p.nextToken() } - if fl, ok := statement.Value.(*ast.FunctionLiteral); ok { - fl.Name = statement.Name.Value - } - return statement } @@ -742,10 +738,6 @@ func (p *Parser) parseAssignStatement() ast.Statement { p.nextToken() } - if fl, ok := statement.Value.(*ast.FunctionLiteral); ok { - fl.Name = statement.Name.Value - } - return statement } } @@ -764,10 +756,6 @@ func (p *Parser) parseAssignStatement() ast.Statement { p.nextToken() } - if fl, ok := statement.Value.(*ast.FunctionLiteral); ok { - fl.Name = statement.Name.Value - } - return statement } From 512e954882e39aa78ddd40ae24a83a4906bcd0a0 Mon Sep 17 00:00:00 2001 From: "Shea Lewis (Kai)" Date: Wed, 5 May 2021 21:36:52 -0700 Subject: [PATCH 2/2] Fix map and method calls --- evaluator/evaluator.go | 53 +++++++++++++++++++++++++++++++++--------- examples/object.ghost | 8 +------ 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/evaluator/evaluator.go b/evaluator/evaluator.go index 74279c7..514c4da 100644 --- a/evaluator/evaluator.go +++ b/evaluator/evaluator.go @@ -126,22 +126,26 @@ func Eval(node ast.Node, env *object.Environment) object.Object { case *ast.ImportExpression: return evalImportExpression(node, env) case *ast.CallExpression: - function := Eval(node.Callable, env) + return evalCallExpression(node, env) + } - if error.IsError(function) { - return function - } + return nil +} - arguments := evalExpressions(node.Arguments, env) +func evalCallExpression(node *ast.CallExpression, env *object.Environment) object.Object { + function := Eval(node.Callable, env) - if len(arguments) == 1 && error.IsError(arguments[0]) { - return arguments[0] - } + if error.IsError(function) { + return function + } + + arguments := evalExpressions(node.Arguments, env) - return applyFunction(node.Token, function, env, arguments) + if len(arguments) == 1 && error.IsError(arguments[0]) { + return arguments[0] } - return nil + return applyFunction(node.Token, function, env, arguments) } // EvalPackage evaluates the specified ghost file and returns an object. @@ -803,7 +807,34 @@ func evalMethodExpression(me *ast.MethodExpression, env *object.Environment) obj return args[0] } - return obj.CallMethod(me.Method.String(), args) + result := obj.CallMethod(me.Method.String(), args) + + if (! error.IsError(result)) { + return result + } + + err := result + + // We don't have a built in method, so do we have an invokable function? + switch obj.(type) { + case *object.Map: + // return evalMapIndexExpression(me.Token.Line, obj, &object.String{Value: me.Method.String()}) + key := &object.String{Value: me.Method.String()} + + mapObject := obj.(*object.Map) + + pair, ok := mapObject.Pairs[key.MapKey()] + + if !ok { + return value.NULL + } + + function := pair.Value + + return applyFunction(me.Token, function, env, args) + } + + return err } func applyFunction(tok token.Token, fn object.Object, env *object.Environment, arguments []object.Object) object.Object { diff --git a/examples/object.ghost b/examples/object.ghost index 9314fa5..3080d54 100644 --- a/examples/object.ghost +++ b/examples/object.ghost @@ -1,13 +1,7 @@ self := {} -test := function() { - print("test!!!") -} - -test() - self.test := function() { - print("test") + print("test!!!") } self.test() \ No newline at end of file