的就是创建这个过程对象时的环境。 5.3.4 环境模型的实现 内容来自www.paper51.com 环境模型需要对外提供一些操作接口如下: paper51.com 1、查找变量的值 http://www.paper51.com 返回此环境中相应变量的约束值,若没有该变量的约束就抛出一个错误。 paper51.com 2、扩展环境 内容来自www.paper51.com 返回一个新环境,这个环境中包含了一个新的空的框架,而其外围环境就是此环境。 http://www.paper51.com 3、定义变量(添加约束) http://www.paper51.com 在环境的第一个框架里加入一个新的约束,它关联起给定的变量和值。如果第一个框架中已经有该变量的约束,则修改它。 copyright paper51.com
4、修改变量 内容来自www.paper51.com
修改变量在环境里的约束,使得该变量约束到给定的值。如果没有这一变量的约束就抛出一个错误。 copyright paper51.com
在实现中,将环境表示为框架的表,框架表示为约束的表,约束表示为变量与值的点对。环境的基本操作有在当前框架中添加一个变量和值的约束;在整个环境中更改一个变量的约束值;在指定框架中查找某个变量的约束;在整个环境中查找某个变量的约束。上面的接口都是基于这几个基本操作来实现的。由于环境是用表来表示的,环境的基本操作都要用基本表操作来实现。 copyright paper51.com 因为所有的表操作都要基于寄存器来进行,所以将环境操作实现为寄存器机器的一部分,具体请参考“虚拟的寄存器机器”的一节。 http://www.paper51.com 5.4 尾递归 copyright paper51.com Scheme语言的一个重要特性是尾递归,这也是本次设计的一个重点。R5RS[1]标准规定,Scheme实现必须是严格尾递归的,即必须支持尾递归。直观上讲,尾递归使得迭代式的递归调用不需要任何额外的存储空间。下面是用Scheme实现的求幂运算,第一个实现为递归式,如下: copyright paper51.com ;; 求幂的递归版本 内容来自论文无忧网 www.paper51.com
;; b^n=b*b^(n-1) 内容来自www.paper51.com ;; b^0=1 paper51.com (define expt 内容来自论文无忧网 www.paper51.com (lambda(b n) 内容来自www.paper51.com
(if (= n 0) 内容来自论文无忧网 www.paper51.com 1 paper51.com (* b (expt b (- n 1)))))) 内容来自论文无忧网 www.paper51.com 用该版本对表达式(expt2 5)求值的过程如下: http://www.paper51.com (expt 2 5) 内容来自论文无忧网 www.paper51.com (* 2 (expt 2 4)) copyright paper51.com (* 2 (* 2 (expt 2 3))) 内容来自www.paper51.com
(* 2 (* 2 (* 2 (expt 2 2)))) 内容来自www.paper51.com (* 2 (* 2 (* 2 (* 2 (expt 2 1))))) 内容来自论文无忧网 www.paper51.com
(* 2 (* 2 (* 2 (* 2 2)))) 内容来自论文无忧网 www.paper51.com (* 2 (* 2 (* 2 4))) 内容来自论文无忧网 www.paper51.com (* 2 (* 2 8)) copyright paper51.com (* 2 16) 内容来自论文无忧网 www.paper51.com 32 copyright paper51.com
第二个实现为迭代式,如下: 内容来自www.paper51.com
;; 求幂的迭代版本 paper51.com
(define expt 内容来自www.paper51.com
(lambda(b n) 内容来自论文无忧网 www.paper51.com (define expt-iter copyright paper51.com (lambda (b nresult) paper51.com (if(= n 0) http://www.paper51.com result http://www.paper51.com (expt-iter b 内容来自论文无忧网 www.paper51.com (- n 1) paper51.com (* b result))))) paper51.com (expt-iter b n 1))) 内容来自论文无忧网 www.paper51.com |