V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kier
V2EX  ›  程序员

sicp,1.5题的疑问

  •  
  •   kier · 2013-07-21 21:08:36 +08:00 · 3631 次点击
    这是一个创建于 4141 天前的主题,其中的信息可能已经有所发展或是发生改变。
    (define (p) (p))

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

    Then he evaluates the expression

    (test 0 (p))


    网上搜索,几乎所有的答案都说正则序会执行if判断后,返回0,不会去计算(p),我的疑问是,书上说的正则序会替换直到得到一个只包含基本运算符的表达式,那么由于p的存在,应该会陷入无穷的替换之中阿,为什么会替换停止
    6 条回复    1970-01-01 08:00:00 +08:00
    clww
        1
    clww  
       2013-07-21 21:31:28 +08:00
    因为还没有到计算的那一步就结束啦
    Golevka
        2
    Golevka  
       2013-07-21 21:36:10 +08:00
    不知道你所谓的正则序是不是call-by-name的意思, CBN会按照substitution rule完全展开之后才开始求值, 因此展开if时(p)是不会被求值的
    Golevka
        3
    Golevka  
       2013-07-21 21:43:08 +08:00
    更正: 展开if时(p)是不会被求值的 => 展开test时(p)不会被求值. 接下来(p)被代换到(if ...)的里面, 由于(= x 0) => (= 0 0)为#t所以(p)作为false branch就不会被求值了
    kier
        4
    kier  
    OP
       2013-07-21 21:58:28 +08:00
    @Golevka 可能是我对正则序的理解有误,我以为的是,它会一直代换,直到整个表达式只有最基本的运算符才截止
    那么另一个说得通的解释是,正则序代换并不是无脑的字符替换,它也是建立在逻辑判断上的,当判断if为真的时候,那么就不代换else子句的内容了?
    standin000
        5
    standin000  
       2013-07-21 22:59:43 +08:00
    正则序是么意思?eval函数很短的,看看就明白执行原理。
    codepiano
        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)永远没有执行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2939 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 14:30 · PVG 22:30 · LAX 06:30 · JFK 09:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.