builtins
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user