Scheme 堆叠解释器(指数时间和字节分配)

Scheme 堆叠解释器(指数时间和字节分配),scheme,interpreter,Scheme,Interpreter,为什么当您将解释器堆叠到另一个解释器上时,经过的实时和字节分配会呈指数增长 如果在方案实现中执行(+12),它将首先计算列表,然后计算操作数(符号到值),然后它知道它是否是基元,因此它会计算参数,最后应用基元过程 现在eval看起来像这样(摘自SICP课堂讲义): (定义(mc eval exp env) (条件((自我评估?经验)经验) ((变量?exp)(查找变量值exp env)) ((报价?exp)(报价文本exp)) ((任务?exp)(评估任务exp env)) ((定义?exp)(

为什么当您将解释器堆叠到另一个解释器上时,经过的实时和字节分配会呈指数增长

如果在方案实现中执行
(+12)
,它将首先计算列表,然后计算操作数(符号到值),然后它知道它是否是基元,因此它会计算参数,最后应用基元过程

现在
eval
看起来像这样(摘自SICP课堂讲义):

(定义(mc eval exp env)
(条件((自我评估?经验)经验)
((变量?exp)(查找变量值exp env))
((报价?exp)(报价文本exp))
((任务?exp)(评估任务exp env))
((定义?exp)(评估定义exp env))
((如果?exp)(如果exp-env,则评估))
((和?exp)(评估和exp环境))
((λ?exp)
(生成程序(lambda参数exp)(lambda主体exp)env))
((开始?试验)(评估顺序(开始操作试验)环境))
((条件试验)(mc评估(条件->如果试验)环境))
((应用程序?exp)
(mc应用(mc评估(操作员经验)环境)
(值列表(操作数exp)env)))
(else(错误“未知表达式类型--MC-EVAL”))
当您调用
(mc eval'(+1 2)null环境)时
可以使用替换规则,这样您就可以看到,在应用了9个案例分析术语之后,它将运行apply,并应用于所有子表达式的
mc eval

(mc eval'(+12)env);=>
(应用(mc评估+环境)(列表(mc评估1环境)(mc评估2环境));=>
(应用(条件((自我评估?'+)'+)
((变量?'+)(查找变量值'+env))
((引用?“+)(引用“+”的文本)
((赋值?'+)(评估赋值'+env))
((定义?'+)(评估定义'+env))
((如果?')+(如果'+env'评估))
((和?'+)(eval和'+env))
((λ?'+)
(生成过程(lambda参数“+)(lambda主体“+)环境))
((开始?“+)(评估序列(开始操作“+)环境))
((cond?'+)(mc eval(cond->if'+)env))
((应用程序?'+)
(mc应用(mc评估(运算符“+)环境)
(值列表(操作数“+)env)))
(否则(错误“未知”+类型--MC-EVAL”))
(列表(条件((自评?1)1)
((变量?1)(查找变量值1 env))
((引用1)(引用1的文本))
((任务?1)(评估任务1环境))
((定义1)(评估定义1环境))
((如果1)(如果1环境评估))
((和?1)(评估和1环境))
((λ?1)
(制造程序(lambda参数1)(lambda主体1)环境)
((开始?1)(评估顺序(开始行动1)环境))
((条件1)(mc评估(条件->如果1)环境))
((申请?1)
(mc应用(mc评估(操作员1)环境)
(值列表(操作数1)env)))
(否则(错误“未知1会话类型--MC-EVAL”))
(条件((自我评估?2)2)
((变量?2)(查找变量值2环境))
((引用?2)(引用2的文本))
((任务2)(评估任务2环境))
((定义2)(评估定义2环境))
((如果?2)(如果2环境评估))
((和?2)(评估和2环境))
((λ?2)
(制造程序(lambda参数2)(lambda主体2)环境)
((开始?2)(评估顺序(开始行动2)环境))
((条件2)(mc评估(条件->如果2)环境))
((申请?2)
(mc应用(mc评估(操作员2)环境)
(值列表(操作数2)env)))
(否则(错误“未知的2会话类型--MC-EVAL”;))))
现在。这是一层。。如果您评估解释器对
(+12)
的评估,它类似于将上面的代码提供给基础方案实现,而不是
(+12)
。第二层
(cond((自评估?1)1))
(+1 2))
更复杂,因此它单独变成底层方案实现的更大代码,而不是
(+1 2)的第一个解释器扩展
由于第一个表达式需要9个大小写项,所有这些项都比原始表达式大,因此在堆叠时理解它是指数型的并不奇怪