aboutsummaryrefslogtreecommitdiff
path: root/go/src/core
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-10-06 20:36:23 -0500
committerJoel Martin <github@martintribe.org>2014-10-06 20:36:23 -0500
commitaf8fdff41e260b1b21be0e127afb536980f43804 (patch)
tree6dc9b5d54a38c6197001291cf85cdffc7cf100b7 /go/src/core
parent9feb2c9527294d82592bf35b97f8039f61bbec45 (diff)
downloadmal-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.go90
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,
+ }