1
1
package main
2
2
3
3
import (
4
- "fmt"
5
4
"bufio"
5
+ "fmt"
6
6
"os"
7
- "strings"
8
7
"strconv"
8
+ "strings"
9
9
)
10
10
11
11
func removeEmpty (tokens []string ) []string {
@@ -25,13 +25,13 @@ func parse(program string) Object {
25
25
26
26
type Env struct {
27
27
mapping map [Symbol ]Object
28
- outer * Env
28
+ outer * Env
29
29
}
30
30
31
31
type Procedure struct {
32
32
body Object
33
33
args []Object
34
- env Env
34
+ env Env
35
35
}
36
36
37
37
type Object interface {}
@@ -92,39 +92,39 @@ func mult(a, b Object) Object {
92
92
93
93
func add (a , b Object ) Object {
94
94
x , y := a .(Number ), b .(Number )
95
- return x + y
95
+ return x + y
96
96
}
97
97
98
98
func sub (a , b Object ) Object {
99
99
x , y := a .(Number ), b .(Number )
100
- return x - y
100
+ return x - y
101
101
}
102
102
103
103
func gt (a , b Object ) Object {
104
104
x , y := a .(Number ), b .(Number )
105
- return x > y
105
+ return x > y
106
106
}
107
107
108
108
func getStandardEnv () Env {
109
109
e := Env {
110
110
mapping : make (map [Symbol ]Object ),
111
111
}
112
112
e .mapping ["*" ] = mult
113
- e .mapping ["+" ] = add
114
- e .mapping ["-" ] = sub
115
- e .mapping [">" ] = gt
113
+ e .mapping ["+" ] = add
114
+ e .mapping ["-" ] = sub
115
+ e .mapping [">" ] = gt
116
116
e .mapping ["pi" ] = Number (3.141592654 )
117
117
return e
118
118
}
119
119
120
120
func (e * Env ) eval (x Object ) Object {
121
121
if val , is_symbol := x .(Symbol ); is_symbol {
122
- return e .mapping [val ]
122
+ return e .mapping [val ]
123
123
} else if _ , is_list := x .(List ); ! is_list {
124
- return x
124
+ return x
125
125
} else if l := x .(List ); l [0 ] == Symbol ("define" ) {
126
126
val := e .eval (l [2 ])
127
- e .mapping [ l [1 ].(Symbol ) ] = val
127
+ e .mapping [l [1 ].(Symbol )] = val
128
128
return val
129
129
} else if l := x .(List ); l [0 ] == Symbol ("if" ) {
130
130
truth := e .eval (l [1 ]).(bool )
@@ -139,7 +139,7 @@ func (e *Env) eval(x Object) Object {
139
139
proc := e .eval (l [0 ])
140
140
a1 := e .eval (l [1 ])
141
141
a2 := e .eval (l [2 ])
142
- res := proc .(func (Object ,Object )Object )(a1 , a2 )
142
+ res := proc .(func (Object , Object ) Object )(a1 , a2 )
143
143
return res
144
144
}
145
145
}
@@ -158,4 +158,3 @@ func main() {
158
158
159
159
repl (e )
160
160
}
161
-
0 commit comments