在上文中,我们实现了格式表达式的转化,我们看到里面需要一个参数 env
,每个表达式都需要根据当前的环境变量来寻找对应的变量或者函数。本文将实现环境变量。
思路
我们可以把环境变量看成是一个递归的 hashmap
,每个 environment
都有一个 frame
,frame
里面有当前环境里面的变量,还有一个 parent_environment
,指向上一个 environment
。所以我们找一个变量,就是从当前环境到其最上级的环境找这个变量。定义一个变量是把这个变量放入当前环境中。
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class Frame: def __init__(self,variables): self._vars = variables def set_variable(self,name,value): self._vars[name] = value def get_variable(self,name): return self._vars[name] def has_variable(self,name): return name in self._vars
class Environment: def __init__(self): self._frame = Frame({}) self._parent_env = None def set_frame(self,frame): self._frame = frame def set_parent_env(self,env): self._parent_env = env def get_variable(self,name): if self._frame.has_variable(name): return self._frame.get_variable(name) if self._parent_env == None: return None return self._parent_env.get_variable(name) def set_variable(self,name,value): if self._frame.has_variable(name): return self._frame.set_variable(name,value) if self._parent_env == None: raise "Cannot find variable " + name return self._parent_env.set_variable(name,value) def define_variable(self,name,value): self._frame.set_variable(name,value) @staticmethod def extend_environment(env): new_env = Environment() new_env.set_parent_env(env) return new_env
|