|
|
|
@ -90,27 +90,26 @@ func eval(exp expression, en *env) (value expression) {
|
|
|
|
|
value = exception("Invalid 'cond' syntax - too few arguments")
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
// CondLoop:
|
|
|
|
|
CondLoop:
|
|
|
|
|
for _, exp := range e[1:] {
|
|
|
|
|
switch i := exp.(type) {
|
|
|
|
|
case []expression:
|
|
|
|
|
if len(i) < 2 {
|
|
|
|
|
value = exception("Invalid 'cond' case, cases must take the form: `(<test> <expression>)")
|
|
|
|
|
break
|
|
|
|
|
break CondLoop
|
|
|
|
|
}
|
|
|
|
|
if i[0] == "else" || i[0] == symbol("else") {
|
|
|
|
|
value = eval(i[1], en)
|
|
|
|
|
break
|
|
|
|
|
break CondLoop
|
|
|
|
|
}
|
|
|
|
|
if AnythingToBool(eval(i[0], en)).(bool) {
|
|
|
|
|
value = eval(i[1], en)
|
|
|
|
|
break
|
|
|
|
|
break CondLoop
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
value = exception("Invalid 'cond' case, cases must take the form: `(<test> <expression>)")
|
|
|
|
|
break
|
|
|
|
|
break CondLoop
|
|
|
|
|
}
|
|
|
|
|
value = make([]expression, 0)
|
|
|
|
|
}
|
|
|
|
|
case "set!":
|
|
|
|
|
if len(e) < 3 {
|
|
|
|
|