File tree 2 files changed +8
-2
lines changed
2 files changed +8
-2
lines changed Original file line number Diff line number Diff line change @@ -157,11 +157,11 @@ func begin(args []Object) Object {
157
157
}
158
158
159
159
func car (args []Object ) Object {
160
- return args [0 ]
160
+ return args [0 ].( List )[ 0 ]
161
161
}
162
162
163
163
func cdr (args []Object ) Object {
164
- return args [1 :]
164
+ return args [0 ].( List )[ 1 :]
165
165
}
166
166
167
167
func getStandardEnv () Env {
@@ -196,6 +196,9 @@ func (e *Env) eval(x Object) Object {
196
196
return e .mapping [val ]
197
197
} else if _ , is_list := x .(List ); ! is_list {
198
198
return x
199
+ } else if l := x .(List ); l [0 ] == Symbol ("quote" ) {
200
+ exp := l [1 ]
201
+ return exp
199
202
} else if l := x .(List ); l [0 ] == Symbol ("define" ) {
200
203
val := e .eval (l [2 ])
201
204
e .mapping [l [1 ].(Symbol )] = val
Original file line number Diff line number Diff line change @@ -34,13 +34,16 @@ func TestEval(t *testing.T) {
34
34
{"(fib 8)" , Number (34 )},
35
35
{"(fib 9)" , Number (55 )},
36
36
{"(fib 10)" , Number (89 )},
37
+ {"(car (quote (5 4 3 2 1)))" , Number (5 )},
38
+ {"(second (quote (1 2 3 4 5)))" , Number (2 )},
37
39
}
38
40
e := getStandardEnv ()
39
41
40
42
// define some functions
41
43
e .eval (parse ("(define circle-area (lambda (r) (* pi (* r r))))" ))
42
44
e .eval (parse ("(define fact (lambda (n) (if (<= n 1) 1 (* n (fact (- n 1))))))" ))
43
45
e .eval (parse ("(define fib (lambda (n) (if (<= n 1) 1 (+ (fib (- n 1)) (fib (- n 2)))))))" ))
46
+ e .eval (parse ("(define second (lambda (x) (car (cdr x))))" ))
44
47
45
48
for _ , c := range cases {
46
49
got := e .eval (parse (c .in ))
You can’t perform that action at this time.
0 commit comments