寻求对SICP练习1.5一些解释(seek for some explanation on SICP

2019-08-31 07:28发布

这个问题可以发现在这里 。

在这本书中,我发现正常秩序评价的一个描述是:

“另一种评价模型不会评估操作数,直到被需要它们的值。相反,它会为参数,直到它获得只涉及原始运营商的表达,然后将执行评估。第一替代操作数表达式”

我还发现了另一种描述简称:“充分扩大,然后缩小”。

在演习中,我想到的定义p是像(lambda () (p))这将永远不会扩展到原始的操作,从而永远无法终止。

然而,在另一方面,一些谷歌上搜索这个问题的答案后,似乎正常秩序的评价应该终止,因为它只计算的东西根据需要和实际(p)将不进行评估。

所以,我认为必须有间“扩大”和“评估”,什么解释在这里所做的是评估一些事情的差异。

究竟有什么区别,还是有,我已经错过了一些点?

另一个问题是:我应该说“ (p)被评估为(p)或“ (p)扩展为(p)

Answer 1:

你说得对,如果要求评价一个适用顺序评估不会终止(p) 然而,在手的问题提到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))

由于if具有上述的语义,并且在膨胀测试条件为(= 0 0)这是真实的,所述正常顺序评估确定评估结果,这是0 ,所以表达式的值是0

然而使用应用性顺序评估,评估第一步骤(test 0 (p))是评估表达式test0 ,和(p)然后调用(“应用”,因此,“应用性”)的值test与通过评估产生的值0(p) 。 由于评价(p)将不能完成,都不会对的评价(test 0 (p))



Answer 2:

在正常的评价规则, (p)将通过调用函数来评价p不带任何参数。 例如(Common Lisp中):

> (defun p ()
    5)
  => P
> (p)
  => 5

你的问题时提到一些被称为“懒惰评估”开始。 Common Lisp的默认情况下不这样做; 它评估所有参数的函数从左至右。 计划没有指定它们的计算顺序,只是他们会。

然而,事情可以被评估之前,他们需要扩大(这可能意味着一些在口齿不清的东西),这使口齿不清控制评价的顺序的能力。 例如, p可能是一个宏。 在这种情况下,正常的评估规则不一定适用。 再次,在Common Lisp的:

> (defmacro p ()
    (print "I'm being expanded!") ; print on expansion
    (terpri) ; new line.
    `(progn (print "I'm being evaluated!") ; print on evaluation
            (terpri)
            5))
  => P

这是进入读取评估打印循环。 表达被读出,然后膨胀,评价,然后进行打印。

> (p)
  I'm being expanded!
  I'm being evaluated!
  => 5

要停止扩建正在评估,让我们坚持在一个lambda。 你会发现,它仍然打印扩展消息。

> (defvar foo (lambda () (p)))
  I'm being expanded!
  => COMPILED FUNCTION #<LAMBDA>

现在,我们把它和形式进行了评价。

> (funcall foo) ; call the function 
  I'm being evaluated!
  => 5

您可以扩大自己的宏调用。

> (macroexpand-1 '(lambda () (p)))
  I'm being expanded!
  => (lambda () (progn (print "I'm being evaluated!")
                       (terpri)
                       5))

语言如哈斯克尔在默认情况下有懒的评价。 在你引用的推移,SICP有你想象口齿不清的一个懒惰的版本。 对于这样一个口齿不清的工作,只有评估是需要的东西,那就需要不只是盲目扩张,直到它到达一个值(见SICP的替代模式的讨论)评估一切,但只是扩张的东西,只有当它是专门询问他们的价值评估的事情。 您可以在上面比较这对本例中,我们扩大了宏观P在lambda表达式的身体,迫使评价与FUNCALL当我们想要的值。 后来在SICP,你会使用类似的技术来实现惰性列表。

正如我说的,哈斯克尔自动做这样的事情,这不是很难想象一个口齿不清,做同样的(虽然,目前还没有流行的那样)。 我想我又有点切线,给书中的实际问题,但希望你能有我的一点怎么跟一个想法是什么评价,并时,差异就可以做到的。



文章来源: seek for some explanation on SICP exercise 1.5
标签: lisp scheme sicp