int() bool() and str()
This commit is contained in:
38
object/builtin_bool.go
Normal file
38
object/builtin_bool.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package object
|
||||
|
||||
// Bool ...
|
||||
func Bool(args ...Object) Object {
|
||||
if len(args) != 1 {
|
||||
return newError("wrong number of arguments. got=%d, want=1", len(args))
|
||||
}
|
||||
|
||||
switch arg := args[0].(type) {
|
||||
case *Null:
|
||||
return &Boolean{Value: false}
|
||||
case *Boolean:
|
||||
return arg
|
||||
case *Integer:
|
||||
if arg.Value == 0 {
|
||||
return &Boolean{Value: false}
|
||||
}
|
||||
return &Boolean{Value: true}
|
||||
case *String:
|
||||
if len(arg.Value) > 0 {
|
||||
return &Boolean{Value: true}
|
||||
}
|
||||
return &Boolean{Value: false}
|
||||
case *Array:
|
||||
if len(arg.Elements) > 0 {
|
||||
return &Boolean{Value: true}
|
||||
}
|
||||
return &Boolean{Value: false}
|
||||
case *Hash:
|
||||
if len(arg.Pairs) > 0 {
|
||||
return &Boolean{Value: true}
|
||||
}
|
||||
return &Boolean{Value: false}
|
||||
|
||||
default:
|
||||
return newError("argument to `bool` not supported, got=%s", args[0].Type())
|
||||
}
|
||||
}
|
||||
29
object/builtin_int.go
Normal file
29
object/builtin_int.go
Normal file
@@ -0,0 +1,29 @@
|
||||
package object
|
||||
|
||||
import "strconv"
|
||||
|
||||
// Int ...
|
||||
func Int(args ...Object) Object {
|
||||
if len(args) != 1 {
|
||||
return newError("wrong number of arguments. got=%d, want=1", len(args))
|
||||
}
|
||||
|
||||
switch arg := args[0].(type) {
|
||||
case *Boolean:
|
||||
if arg.Value {
|
||||
return &Integer{Value: 1}
|
||||
}
|
||||
return &Integer{Value: 0}
|
||||
case *Integer:
|
||||
return arg
|
||||
case *String:
|
||||
n, err := strconv.ParseInt(arg.Value, 10, 64)
|
||||
if err != nil {
|
||||
return newError("could not parse string to int: %s", err)
|
||||
}
|
||||
|
||||
return &Integer{Value: n}
|
||||
default:
|
||||
return newError("argument to `int` not supported, got=%s", args[0].Type())
|
||||
}
|
||||
}
|
||||
19
object/builtin_str.go
Normal file
19
object/builtin_str.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package object
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Str ...
|
||||
func Str(args ...Object) Object {
|
||||
if len(args) != 1 {
|
||||
return newError("wrong number of arguments. got=%d, want=1", len(args))
|
||||
}
|
||||
|
||||
arg, ok := args[0].(fmt.Stringer)
|
||||
if !ok {
|
||||
return newError("argument to `str` not supported, got %s", args[0].Type())
|
||||
}
|
||||
|
||||
return &String{Value: arg.String()}
|
||||
}
|
||||
@@ -17,6 +17,9 @@ var Builtins = map[string]*Builtin{
|
||||
"pop": {Name: "pop", Fn: Pop},
|
||||
"exit": {Name: "exit", Fn: Exit},
|
||||
"assert": {Name: "assert", Fn: Assert},
|
||||
"bool": {Name: "bool", Fn: Bool},
|
||||
"int": {Name: "int", Fn: Int},
|
||||
"str": {Name: "str", Fn: Str},
|
||||
}
|
||||
|
||||
// BuiltinsIndex ...
|
||||
|
||||
Reference in New Issue
Block a user