用python實現一個簡易的lisp解釋器--解釋器基本結構的實現(5)

本文我們將實現一個解釋器的基本結構。

思路

一個解釋器的執行主要靠兩個函數:evalapply

eval 會把你輸入的表達式分解成更小的表達式並逐個執行,而 apply 會執行你的表達式。基本流程是這樣的,例如你輸入一個表達式 (+ 1 2 (/ 3 3)),首先 eval 會把 (+ 1 2 (/ 3 3)) 視為一整個表達式,然後會遞歸執行 eval 解析 (/ 3 3) ,最後 (/ 2 3) 這個表達式已經不可再分解了,就會調用 apply 執行 / 的操作,最後返回結果給上一個表達式,得 (+ 1 2 1),再執行 apply 得出最終結果 4

其中 primitive 為默認的操作符,例如 +-*/,我們之後再實現。

實現

class Evaluator: def __init__(self,primitives): self._exp_parser = ExpressionParser() self._primitives = primitives def eval(self,exp,env): if exp == []: return if isinstance(exp,Expression) == False: exp = self._exp_parser.parse(exp,env) return exp.eval(self,env) def apply(self,proc,args): if isinstance(proc,ProcedureExpression): proc.env = Environment.extend_environment(dict(zip(proc.args, args)),proc.env) return proc.eval(self,proc.env) return proc(*args)def init_primitives(): global_env.get_frame().set_variables(primitives)def run_evaluator(): print("--------------------
") print("Input Expression:
") exp = raw_input() exp = exp_formattor.format(exp) print(evaluator.eval(exp,global_env)) print("
End Evaluation") print("--------------------
") run_evaluator()if __name__ == __main__: global_env = Environment() exp_formattor = ExpressionFormattor() primitives = { "+": add, "-": subtract, "*": multiply, "/": divide, "=": equal, "list": to_list, "cons": cons, "car": car, "cdr": cdr, "null?": null} init_primitives() evaluator = Evaluator(primitives) run_evaluator()

推薦閱讀:

sicp 習題1.5 正則序和應用序求值疑問?
EOPL是一本怎樣的書?和SICP如何比較?
SICP中環境模型可以等價為龍書中(第七章)講的的運行時刻環境么?
SICP 是不是被高估了?
用python實現一個簡易的lisp解釋器--表達式字元串的格式化(2)

TAG:解釋器 | Scheme | SICP |