This commit is contained in:
Chuck Smith
2024-01-21 11:41:17 -05:00
parent 13c9062fed
commit 6bb06370bb
4 changed files with 87 additions and 11 deletions

View File

@@ -264,11 +264,15 @@ func newError(format string, a ...interface{}) *object.Error {
}
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)
if val, ok := env.Get(node.Value); ok {
return val
}
return val
if builtin, ok := builtins[node.Value]; ok {
return builtin
}
return newError("identifier not found: " + node.Value)
}
func evalExpressions(exps []ast.Expression, env *object.Environment) []object.Object {
@@ -286,14 +290,20 @@ func evalExpressions(exps []ast.Expression, env *object.Environment) []object.Ob
}
func applyFunction(fn object.Object, args []object.Object) object.Object {
function, ok := fn.(*object.Function)
if !ok {
newError("not a function: %s", fn.Type())
}
switch fn := fn.(type) {
extendedEnv := extendFunctionEnv(function, args)
evaluated := Eval(function.Body, extendedEnv)
return unwrapReturnValue(evaluated)
case *object.Function:
extendedEnv := extendFunctionEnv(fn, args)
evaluated := Eval(fn.Body, extendedEnv)
return unwrapReturnValue(evaluated)
case *object.Builtin:
return fn.Fn(args...)
default:
return newError("not a function: %s", fn.Type())
}
}
func extendFunctionEnv(fn *object.Function, args []object.Object) *object.Environment {