Skip to content

Commit

Permalink
fixes #16
Browse files Browse the repository at this point in the history
  • Loading branch information
odino committed Dec 19, 2018
1 parent 9597971 commit df6c79f
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 7 deletions.
1 change: 1 addition & 0 deletions evaluator/evaluator_test.go
Expand Up @@ -361,6 +361,7 @@ func TestBuiltinFunctions(t *testing.T) {
input string
expected interface{}
}{
{`rand(1)`, 0},
{`int(10)`, 10},
{`int("10")`, 10},
{`int("abc")`, `int(...) can only be called on strings which represent integers, 'abc' given`},
Expand Down
34 changes: 27 additions & 7 deletions evaluator/functions.go
Expand Up @@ -3,7 +3,9 @@ package evaluator
import (
"abs/object"
"abs/util"
"crypto/rand"
"fmt"
"math/big"
"os"
"strconv"
)
Expand All @@ -13,8 +15,7 @@ func getFns() map[string]*object.Builtin {
"len": &object.Builtin{
Fn: func(args ...object.Object) object.Object {
if len(args) != 1 {
return util.NewError("wrong number of arguments. got=%d, want=1",
len(args))
return util.NewError("wrong number of arguments. got=%d, want=1", len(args))
}

switch arg := args[0].(type) {
Expand All @@ -28,7 +29,28 @@ func getFns() map[string]*object.Builtin {
}
},
},
// exit(0)
// rand(max:20)
"rand": &object.Builtin{
Fn: func(args ...object.Object) object.Object {
if len(args) != 1 {
return util.NewError("wrong number of arguments. got=%d, want=1", len(args))
}

switch arg := args[0].(type) {
case *object.Integer:
r, err := rand.Int(rand.Reader, big.NewInt(arg.Value))

if err != nil {
return util.NewError("error occurred while calling 'rand(%d)': %s", arg.Value, err.Error())
}

return &object.Integer{Value: r.Int64()}
default:
return util.NewError("argument to `rand(...)` not supported, got %s", arg.Type())
}
},
},
// exit(code:0)
"exit": &object.Builtin{
Fn: func(args ...object.Object) object.Object {
if len(args) != 1 {
Expand Down Expand Up @@ -84,16 +106,14 @@ func getFns() map[string]*object.Builtin {
"env": &object.Builtin{
Fn: func(args ...object.Object) object.Object {
if len(args) != 1 {
return util.NewError("wrong number of arguments. got=%d, want=1",
len(args))
return util.NewError("wrong number of arguments. got=%d, want=1", len(args))
}

switch arg := args[0].(type) {
case *object.String:
return &object.String{Value: os.Getenv(arg.Value)}
default:
return util.NewError("argument to `env` not supported, got %s",
args[0].Type())
return util.NewError("argument to `env` not supported, got %s", args[0].Type())
}
},
},
Expand Down
1 change: 1 addition & 0 deletions examples/rand.abs
@@ -0,0 +1 @@
echo(rand(100000))

0 comments on commit df6c79f

Please sign in to comment.