问题可以找到here.
在书中,我发现对正常订单评估的描述是:
“另一种评估模型在需要操作数的值之前不会评估操作数。相反,它会首先用操作数表达式替换参数,直到获得仅涉及原始运算符的表达式,然后执行评估。”
我还发现了另一个简短的描述:“充分扩展然后缩小”。
在练习中,我认为定义p
是这样的(lambda () (p))
,
它永远不会扩展为原始运算符,因此永远不会终止。
然而,另一方面,在谷歌搜索这个问题的一些答案后,似乎正常的顺序评估应该终止,因为它只根据需要评估事物,并且实际上(p)
不会被评价。
所以我认为“扩展”和“评估”之间一定有一些区别,解释器在这里所做的是评估事物。
到底有什么区别,或者
我是否遗漏了一些要点?
另一个问题:我应该说“(p)
被评估为(p)
" or "(p)
被扩展为(p)
"?
你是对的,如果要求评估,应用顺序评估器不会终止(p)
。然而,手头的问题提到if
具有由应用和正常顺序求值器共享的特定求值语义。具体来说,“假设无论解释器使用正常顺序还是应用顺序,特殊形式 if 的求值规则都是相同的:首先对谓词表达式求值,然后根据结果确定是对后继表达式还是替代表达式求值。”
练习中的代码是
(define (p) (p))
(define (test x y)
(if (= x 0)
0
y))
正在考虑的测试是
(test 0 (p))
正态顺序评估是“完全扩展然后减少”选项。在正态顺序评估下,(test 0 (p))
完全展开为
(test 0 (p)) ==
(if (= 0 0)
0
(p))
Since if
具有上述语义,扩展中的测试条件为(= 0 0)
,这是正确的,正常顺序评估器决定评估结果,即0
,所以表达式的值为0
.
Using the applicative-order evaluation however, the first step in evaluating (test 0 (p))
is to evaluate the expressions test
, 0
, and (p)
, and then call ("apply", hence "applicative") the value of test
with the values produced by evaluating 0
and (p)
. Since the evaluation of (p)
will not complete, neither will the evaluation of (test 0 (p))
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)