94e24527ec57cc4ab0494edd629ebbca944c3e65
[jackhill/mal.git] / go / src / core / core.go
1 package core
2
3 import (
4 "errors"
5 "io/ioutil"
6 "fmt"
7 )
8
9 import (
10 . "types"
11 "reader"
12 "printer"
13 )
14
15
16 // String functions
17
18 func pr_str(a []MalType) (MalType, error) {
19 return printer.Pr_list(a, true, "", "", " "), nil
20 }
21
22 func str(a []MalType) (MalType, error) {
23 return printer.Pr_list(a, false, "", "", ""), nil
24 }
25
26 func prn(a []MalType) (MalType, error) {
27 fmt.Println(printer.Pr_list(a, true, "", "", " "))
28 return nil, nil
29 }
30
31 func println(a []MalType) (MalType, error) {
32 fmt.Println(printer.Pr_list(a, false, "", "", " "))
33 return nil, nil
34 }
35
36 func slurp(a []MalType) (MalType, error) {
37 b, e := ioutil.ReadFile(a[0].(string))
38 if e != nil { return nil, e }
39 return string(b), nil
40 }
41
42
43 // Sequence functions
44
45 func empty_Q(a []MalType) (MalType, error) {
46 switch obj := a[0].(type) {
47 case List: return len(obj.Val) == 0, nil
48 case Vector: return len(obj.Val) == 0, nil
49 case nil: return true, nil
50 default: return nil, errors.New("Count called on non-sequence")
51 }
52 }
53
54 func count(a []MalType) (MalType, error) {
55 switch obj := a[0].(type) {
56 case List: return len(obj.Val), nil
57 case Vector: return len(obj.Val), nil
58 case nil: return 0, nil
59 default: return nil, errors.New("Count called on non-sequence")
60 }
61 }
62
63
64 // core namespace
65 var NS = map[string]MalType{
66 "=": func(a []MalType) (MalType, error) {
67 return Equal_Q(a[0], a[1]), nil },
68
69 "pr-str": func(a []MalType) (MalType, error) { return pr_str(a) },
70 "str": func(a []MalType) (MalType, error) { return str(a) },
71 "prn": func(a []MalType) (MalType, error) { return prn(a) },
72 "println": func(a []MalType) (MalType, error) { return println(a) },
73 "read-string": func(a []MalType) (MalType, error) {
74 return reader.Read_str(a[0].(string)) },
75 "slurp": slurp,
76
77 "<": func(a []MalType) (MalType, error) {
78 return a[0].(int) < a[1].(int), nil },
79 "<=": func(a []MalType) (MalType, error) {
80 return a[0].(int) <= a[1].(int), nil },
81 ">": func(a []MalType) (MalType, error) {
82 return a[0].(int) > a[1].(int), nil },
83 ">=": func(a []MalType) (MalType, error) {
84 return a[0].(int) >= a[1].(int), nil },
85 "+": func(a []MalType) (MalType, error) {
86 return a[0].(int) + a[1].(int), nil },
87 "-": func(a []MalType) (MalType, error) {
88 return a[0].(int) - a[1].(int), nil },
89 "*": func(a []MalType) (MalType, error) {
90 return a[0].(int) * a[1].(int), nil },
91 "/": func(a []MalType) (MalType, error) {
92 return a[0].(int) / a[1].(int), nil },
93
94 "list": func(a []MalType) (MalType, error) {
95 return List{a}, nil },
96 "list?": func(a []MalType) (MalType, error) {
97 return List_Q(a[0]), nil },
98
99 "empty?": empty_Q,
100 "count": count,
101 }