1
clww 2013-07-21 21:31:28 +08:00
因为还没有到计算的那一步就结束啦
|
2
Golevka 2013-07-21 21:36:10 +08:00
不知道你所谓的正则序是不是call-by-name的意思, CBN会按照substitution rule完全展开之后才开始求值, 因此展开if时(p)是不会被求值的
|
3
Golevka 2013-07-21 21:43:08 +08:00
更正: 展开if时(p)是不会被求值的 => 展开test时(p)不会被求值. 接下来(p)被代换到(if ...)的里面, 由于(= x 0) => (= 0 0)为#t所以(p)作为false branch就不会被求值了
|
4
kier OP @Golevka 可能是我对正则序的理解有误,我以为的是,它会一直代换,直到整个表达式只有最基本的运算符才截止
那么另一个说得通的解释是,正则序代换并不是无脑的字符替换,它也是建立在逻辑判断上的,当判断if为真的时候,那么就不代换else子句的内容了? |
5
standin000 2013-07-21 22:59:43 +08:00
正则序是么意思?eval函数很短的,看看就明白执行原理。
|
6
codepiano 2013-07-22 00:38:43 +08:00 1
@kier sicp里面讲正则序应用序的部分在语言组织上有些不清楚,楼主可能没看明白具体的定义
应用序定义:“解释器首先对运算符和各个运算对象求值,而后将得到的过程应用于得到的实际参数” 正则序定义:“先不求出运算对象的值,直到实际需要它们的值时再去做” 当使用应用序求(test 0 (p))时,解释器会对0和(p)进行求值,会造成无限循环 而使用正则序求(test 0 (p))时,解释器会对test函数进行展开,将0和(p)代入到test函数的定义中去,在需要时才对0和(p)进行求值,(test 0 (p))代换为:(if (= 0 0) 0 (p))),此处并未对(p)进行求值 而程序执行过程中,返回if的第一个分支,所以(p)永远没有执行 |