[Back]

5.4 显示控制的求值器

5.23

(test (op cond?) (reg expr)) 
(branch (label ev-cond)) 
  
ev-cond 
(assign expr (op cond->if) (reg expr)) 
(goto (label ev-if))

5.24

 ev-cond 
 (assign expr (op cond-clauses) (reg expr)) 
 (test (op null?) (reg expr))   
 (branch (label ev-cond-end)) 
 (assign unev (op car) (reg expr)) 
 (assign expr (op cdr) (reg expr)) 
 (test (op cond-else-clauses?) (reg unev)) 
 (branch (label cond-else)) 
 (save env) 
 (save continue) 
 (save unev) 
 (save expr) 
 (assign continue (label ev-cond-loop)) 
 (assign expr (op cond-predicate) (reg unev)) 
 (goto (label ev-dispatch)) 
  
 ev-cond-loop 
 (restore expr) 
 (test (op true?) (reg val)) 
 (branch (label cond-result)) 
 (restore unev) 
 (restore continue) 
 (restore env) 
 (goto (label ev-cond)) 
 cond-result 
 (restore unev) 
 (assign expr (op cond-actions) (reg unev)) 
 (assign expr (op sequence->exp) (reg expr)) 
 (goto (label ev-dispatch)) 
  
 cond-else 
 (assign unev (op cond-actions) (reg unev)) 
 (assign expr (op sequence->exp) (reg unev)) 
 (goto (label ev-dispatch)) 
  
 ev-cond-end    
 (goto (reg continue)) 

5.25

搁置

5.26

最大深度是10

压栈次数是35*n + 29

5.27

递归的压栈次数和迭代差不多,但是栈的深度应该是n的线性函数

5.28

自行模拟

5.29

空间需求大致是递归阶乘的两倍,大约8*n

S(n) = S(n-1) + S(n-2) + 42

S(n) = 60Fib(n+1) - 42

5.30

搁置