"或"的不同方案程序

时间:2014-05-02 19:15:12

标签: functional-programming scheme racket procedure

我目前正在学习计划,并遇到了以下问题:

证明或反驳以下声明: 程序my-or:

     (define my-or
       (lambda (test1 test2)
            (if test1
                #t
                test2)))

的工作方式与内置程序相同"或"有两个参数。 tipp:

  

(或)= #f

(or <a1> ... <an>) = (if <a1>
                          #t
                         (or <a2> ... <an>))
如果你反驳声明,找一个程序,两者之间的区别 程序可以被注意到。

所以,我相信两个程序之间没有区别,因为它们对两个参数的工作方式相同(这个树图描绘的是基于过程的racket文档if和or): / p>

                       if/or
                    ..     ..
                 #f          #t
               ..              ..
            test2                outcome: #t
          ..     ..
        #f         #t
      ..             ..
   outcome: #f        outcome: #t

而且,因为如果我重写我的 - 或者在第二个tipp中提到的方式 我仍然得到相同的输出,例如:

     > (my-or (= 10 10) (> 2 5)) 
       --> #t
     > (my-or (> 23 42) (< 5 2)) 
       --> #t

重写:

     > (if (= 10 10) #t (or (> 2 5)))
       --> #t
     > (if (> 23 42) #t (or (< 5 2)))
       --> #f
唯一困扰我的是我们应该反驳声明,因为提到:&#34;如果你反驳声明,找一个可以注意到两个程序之间差异的程序。 &#34;

这就是为什么我不想知道是否有人有理由反驳该陈述,或者是否有人可以否认我的想法如何证明该陈述是正确的。

1 个答案:

答案 0 :(得分:2)

实际上,基于过程的版本my-or与内置版or不同。要证明这一点,试试这个:

(or 1 (/ 1 0))
=> 1

(my-or 1 (/ 1 0))
=> /: division by zero

说明:

  • 内置or特殊形式,这意味着:or通常适用于程序的评估规则是不同的(顺便说一句,相同适用于and
  • or使其参数的评估短路:返回非假的第一个参数的值作为结果返回,其余参数将评价<!/ LI>
  • my-or执行正常的函数调用,所有其参数将在传递给my-or的正文之前进行评估
  • 上面的示例清楚地表明:or不会将除法评估为零,它会在找到第一个非假值后立即返回,而my-or会计算两者< / em>参数在继续之前,并且因为遇到除零而失败