SICP学习笔记--求值策略 (Evaluation strategy) --应用次序 (Applicative order) vs 正常次序 (Normal order)

来源:互联网 发布:淘宝哪些卖大衣的好店 编辑:程序博客网 时间:2024/05/17 02:53

wiki:

严格求值 (Strict evaluation)

在“严格求值”中,给函数的实际参数总是在应用这个函数之前求值。

在邱奇编码下,算子的热情求值映射到了函数的严格求值;为此严格求值有时叫做“热情求值”。多数现存编程语言对函数使用严格求值。

应用次序 (Applicative order)

“应用次序”(或“最左最内”)求值称呼函数的实际参数按可归约表达式的后序遍历从左至右的求值的策略。不像传值调用,应用次序求值尽可能的在应用函数之前归约函数体内的项。

非严格求值 (Non-strict evaluation)

在“非严格求值”中,不求值给函数的实际参数,除非它们在函数体内实际上被用到了。

在邱奇编码下,算子的惰性求值映射到了函数的非严格求值;为此,非严格求值有时也叫做“惰性求值”。布尔表达式在很多语言中使用惰性求值;在这种上下文中它通常叫做短路求值。条件表达式也通常使用惰性求值,但出于不同的原因。

正常次序 (Normal order)

“正常次序”(或“最左最外”)求值是总是归约的最外可归约式,在求值函数的实际参数之前应用函数的求值策略。它不同于传名调用,传名调用不进入未应用的函数体内求值。

求以下代码输出:

(define (p) (p))(define (test x y)    (if (= x 0)        0        y))(test 0 (p))

scheme中运行结果为无限循环:应用次序解析( test  0    ( p )  ), 在解析到(p)时,会把define的函数进行(p)进行替换,这样形成了一个无限循环

0 0
原创粉丝点击