11from typing import Any
2- from .mytypes import Environment , Expression , Symbol
32
3+ from .parser import s_expr
4+ from .mytypes import Environment , Expression , InvalidSyntax , Symbol , UndefinedSymbol
45
5- def evaluate (x : Expression , env : Environment ) -> Any :
6+
7+ def evaluate (exp : Expression , env : Environment ) -> Any :
68 "Evaluate an expression in an environment."
7- if isinstance (x , Symbol ): # variable reference
8- return env [x ]
9- elif not isinstance (x , list ): # constant literal
10- return x
11- elif x [0 ] == 'define' : # (define var exp)
12- _ , var , exp = x
13- env [var ] = evaluate (exp , env )
14- else : # (proc arg...)
15- proc_exp , * args = x
16- proc = evaluate (proc_exp , env )
17- arg_values = [evaluate (exp , env ) for exp in args ]
18- return proc (* arg_values )
9+ match exp :
10+ case int (x ) | float (x ): # number literal
11+ return x
12+ case Symbol (var ): # variable reference
13+ try :
14+ return env [var ]
15+ except KeyError as exc :
16+ raise UndefinedSymbol (var ) from exc
17+ case ['define' , Symbol (var ), value_exp ]: # (define var exp)
18+ env [var ] = evaluate (value_exp , env )
19+ case [op , * args ]: # (op arg1...)
20+ proc = evaluate (op , env )
21+ values = [evaluate (arg , env ) for arg in args ]
22+ return proc (* values )
23+ case _:
24+ raise InvalidSyntax (s_expr (exp ))
0 commit comments