我目前正在学习计划,并遇到了以下问题:
证明或反驳以下声明: 程序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;
这就是为什么我不想知道是否有人有理由反驳该陈述,或者是否有人可以否认我的想法如何证明该陈述是正确的。
答案 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>参数在继续之前,并且因为遇到除零而失败