diff options
| author | Joel Martin <github@martintribe.org> | 2014-10-06 20:36:23 -0500 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2014-10-06 20:36:23 -0500 |
| commit | af8fdff41e260b1b21be0e127afb536980f43804 (patch) | |
| tree | 6dc9b5d54a38c6197001291cf85cdffc7cf100b7 /go/src/core | |
| parent | 9feb2c9527294d82592bf35b97f8039f61bbec45 (diff) | |
| download | mal-af8fdff41e260b1b21be0e127afb536980f43804.tar.gz mal-af8fdff41e260b1b21be0e127afb536980f43804.zip | |
go: add step4_if_fn_do
Diffstat (limited to 'go/src/core')
| -rw-r--r-- | go/src/core/core.go | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/go/src/core/core.go b/go/src/core/core.go new file mode 100644 index 0000000..9df71a6 --- /dev/null +++ b/go/src/core/core.go @@ -0,0 +1,90 @@ +package core + +import ( + "errors" + "fmt" +) + +import ( + . "types" + "printer" +) + + +// String functions + +func pr_str(a []MalType) (MalType, error) { + return printer.Pr_list(a, true, "", "", " "), nil +} + +func str(a []MalType) (MalType, error) { + return printer.Pr_list(a, false, "", "", ""), nil +} + +func prn(a []MalType) (MalType, error) { + fmt.Println(printer.Pr_list(a, true, "", "", " ")) + return nil, nil +} + +func println(a []MalType) (MalType, error) { + fmt.Println(printer.Pr_list(a, false, "", "", " ")) + return nil, nil +} + + +// Sequence functions + +func empty_Q(a []MalType) (MalType, error) { + switch obj := a[0].(type) { + case List: return len(obj.Val) == 0, nil + case Vector: return len(obj.Val) == 0, nil + case nil: return true, nil + default: return nil, errors.New("Count called on non-sequence") + } +} + +func count(a []MalType) (MalType, error) { + switch obj := a[0].(type) { + case List: return len(obj.Val), nil + case Vector: return len(obj.Val), nil + case nil: return 0, nil + default: return nil, errors.New("Count called on non-sequence") + } +} + + +// core namespace +var NS = map[string]MalType{ + "=": func(a []MalType) (MalType, error) { + return Equal_Q(a[0], a[1]), nil }, + + "pr-str": func(a []MalType) (MalType, error) { return pr_str(a) }, + "str": func(a []MalType) (MalType, error) { return str(a) }, + "prn": func(a []MalType) (MalType, error) { return prn(a) }, + "println": func(a []MalType) (MalType, error) { return println(a) }, + + "<": func(a []MalType) (MalType, error) { + return a[0].(int) < a[1].(int), nil }, + "<=": func(a []MalType) (MalType, error) { + return a[0].(int) <= a[1].(int), nil }, + ">": func(a []MalType) (MalType, error) { + return a[0].(int) > a[1].(int), nil }, + ">=": func(a []MalType) (MalType, error) { + return a[0].(int) >= a[1].(int), nil }, + "+": func(a []MalType) (MalType, error) { + return a[0].(int) + a[1].(int), nil }, + "-": func(a []MalType) (MalType, error) { + return a[0].(int) - a[1].(int), nil }, + "*": func(a []MalType) (MalType, error) { + return a[0].(int) * a[1].(int), nil }, + "/": func(a []MalType) (MalType, error) { + return a[0].(int) / a[1].(int), nil }, + + "list": func(a []MalType) (MalType, error) { + return List{a}, nil }, + "list?": func(a []MalType) (MalType, error) { + return List_Q(a[0]), nil }, + + "empty?": empty_Q, + "count": count, + } |
