@@ -140,7 +140,10 @@ def lispstr(exp: object) -> str:
140
140
################ Evaluator
141
141
142
142
# tag::EVALUATE[]
143
- KEYWORDS = ['quote' , 'if' , 'lambda' , 'define' , 'set!' ]
143
+ KEYWORDS = {'quote' , 'if' , 'lambda' , 'define' , 'set!' }
144
+
145
+ def is_keyword (s : Any ) -> bool :
146
+ return isinstance (s , Symbol ) and s in KEYWORDS
144
147
145
148
def evaluate (exp : Expression , env : Environment ) -> Any :
146
149
"Evaluate an expression in an environment."
@@ -164,7 +167,11 @@ def evaluate(exp: Expression, env: Environment) -> Any:
164
167
env [name ] = Procedure (parms , body , env )
165
168
case ['set!' , Symbol (var ), value_exp ]:
166
169
env .change (var , evaluate (value_exp , env ))
170
+ < << << << HEAD
167
171
case [func_exp , * args ] if func_exp not in KEYWORDS :
172
+ == == == =
173
+ case [func_exp , * args ] if not is_keyword (func_exp ):
174
+ >> >> >> > 3 ecfb212c6273122797c76876d6b373b2cb94fa6
168
175
proc = evaluate (func_exp , env )
169
176
values = [evaluate (arg , env ) for arg in args ]
170
177
return proc (* values )
0 commit comments