further improvements
This commit is contained in:
@@ -126,7 +126,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, Env: env, Body: body}
|
||||
return object.Function{Parameters: params, Env: env, Body: body}
|
||||
|
||||
// Expressions
|
||||
case *ast.IntegerLiteral:
|
||||
@@ -560,12 +560,12 @@ func evalExpressions(exps []ast.Expression, env *object.Environment) []object.Ob
|
||||
func applyFunction(fn object.Object, args []object.Object) object.Object {
|
||||
switch fn := fn.(type) {
|
||||
|
||||
case *object.Function:
|
||||
case object.Function:
|
||||
extendedEnv := extendFunctionEnv(fn, args)
|
||||
evaluated := Eval(fn.Body, extendedEnv)
|
||||
return unwrapReturnValue(evaluated)
|
||||
|
||||
case *object.Builtin:
|
||||
case object.Builtin:
|
||||
if result := fn.Fn(args...); result != nil {
|
||||
return result
|
||||
}
|
||||
@@ -577,7 +577,7 @@ func applyFunction(fn object.Object, args []object.Object) object.Object {
|
||||
}
|
||||
}
|
||||
|
||||
func extendFunctionEnv(fn *object.Function, args []object.Object) *object.Environment {
|
||||
func extendFunctionEnv(fn object.Function, args []object.Object) *object.Environment {
|
||||
env := object.NewEnclosedEnvironment(fn.Env)
|
||||
|
||||
for paramIdx, param := range fn.Parameters {
|
||||
|
||||
@@ -354,7 +354,7 @@ func TestFunctionObject(t *testing.T) {
|
||||
input := "fn(x) { x + 2; };"
|
||||
|
||||
evaluated := testEval(input)
|
||||
fn, ok := evaluated.(*object.Function)
|
||||
fn, ok := evaluated.(object.Function)
|
||||
if !ok {
|
||||
t.Fatalf("object is not Function. got=%T (%+v)", evaluated, evaluated)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user