欢迎关注个人博客网站 waterlaw.topexpress
心智的活动, 除了尽力生产各类简单的认识以外,主要表如今以下三个方面:函数
1)
将若干简单的认识组合为一个复合的认识, 由此产生出各类复杂的认识。网站
2)将两个认识放在一块儿对照,无论它们如何简单或者复杂,在这样作时并不将它们合而为一。由此获得有关它们的相互关系的认识。指针
3)将有关认识与那些在实际中和它们同在的全部其余认识隔离开,这就是抽象,全部具备广泛性的认识都是这样获得的。code
-- John Locke. (有关人类理解的随笔, 1690)
正则序: 解释器首先对运算符和各个运算对象求值,然后将获得的过程应用于实际的参数。举个粒子:
预先定义:对象
(define (square x) (* x x)) (define (sum-of-squares x y) (+ (square x) (square y))) (define (f a) (sum-of-squares (+ a 1) (+ a 2)))
求表达式 (f, 5) 的值。递归
(sum-of-squares (+ 5 1) (+ 5 2)) (+ (square (+ 5 1)) (square (+ 5 2))) (+ (* (+ 5 1) (+ 5 1)) (* (+ 5 2) (+ 5 2))) (+ (* 6 6) (* 7 7)) (+ 36 49) 85
这种“彻底展开然后归约”的求值模型称为正则序求值。与之相对的是现代解释器采用的是先求值参数然后应用的方式,它称为应用序求值。字符串
(cond (<e1> <p1>) (<e2> <p2>) .. (<en> <pn>))
(if <pred> <conse> <alter>) (and <e1> <e2> ...<en>) (or <e1> <e2> ... <en>) (not <e>)
Ben 发明了一种方法检测解释器采用哪一种方式求值,他定义了一个过程:get
(define (p) (p)) (define (test x y) (if (= 0 x) 0 y))
然后他求下面表达式的值:博客
(test 0 (p))
若是解释器采用应用序求值, Ben 将会看到什么? 若是解释器采用正则器求值, Ben 又会看到什么?假设 if 语句在两种求值方式中的规则是同样的, 即谓词老是先被执行。
答: 若是解释器采用应用序求值, 那么必须知道表达式 (p) 的值, (p) 是一个调用本身的函数。
(test 0 (p)) (test 0 (p)) ...
反之若是解释器采用正则序求值,那么
(test 0 (p)) (if (= 0 0) 0 (p)) 0
平方根函数可定义为: 根号 x = 存在这样的 y, y >= 0 而且 y^2 = x;
(define (sqrt x) (the y (and (>= y 0) (= (sqrt y) x) ))
这样又从新提出了原来的问题。函数只不过是描述一件事情的特征,并无描述如何计算的过程。在数学里,人们一般关心的是说明性的描述(是什么),而在计算机科学,人们一般更关心行动性的描述(怎么作)。计算机如何计算平方根呢? 最经常使用的就是牛顿的逐步逼近法。这一方法告诉咱们:若是。。。