Skip to content

Commit b7592ef

Browse files
author
Jeff Aigner
committed
Adding quote built-in. Fixed car/cdr which now function properly. Added tests for car/cdr/quote
1 parent 3f05a52 commit b7592ef

File tree

2 files changed

+8
-2
lines changed

2 files changed

+8
-2
lines changed

lisp.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -157,11 +157,11 @@ func begin(args []Object) Object {
157157
}
158158

159159
func car(args []Object) Object {
160-
return args[0]
160+
return args[0].(List)[0]
161161
}
162162

163163
func cdr(args []Object) Object {
164-
return args[1:]
164+
return args[0].(List)[1:]
165165
}
166166

167167
func getStandardEnv() Env {
@@ -196,6 +196,9 @@ func (e *Env) eval(x Object) Object {
196196
return e.mapping[val]
197197
} else if _, is_list := x.(List); !is_list {
198198
return x
199+
} else if l := x.(List); l[0] == Symbol("quote") {
200+
exp := l[1]
201+
return exp
199202
} else if l := x.(List); l[0] == Symbol("define") {
200203
val := e.eval(l[2])
201204
e.mapping[l[1].(Symbol)] = val

lisp_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,16 @@ func TestEval(t *testing.T) {
3434
{"(fib 8)", Number(34)},
3535
{"(fib 9)", Number(55)},
3636
{"(fib 10)", Number(89)},
37+
{"(car (quote (5 4 3 2 1)))", Number(5)},
38+
{"(second (quote (1 2 3 4 5)))", Number(2)},
3739
}
3840
e := getStandardEnv()
3941

4042
// define some functions
4143
e.eval(parse("(define circle-area (lambda (r) (* pi (* r r))))"))
4244
e.eval(parse("(define fact (lambda (n) (if (<= n 1) 1 (* n (fact (- n 1))))))"))
4345
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))))"))
4447

4548
for _, c := range cases {
4649
got := e.eval(parse(c.in))

0 commit comments

Comments
 (0)