定义一个过程"和",为我们的过程实现布尔和函数true和false - (test(和p q))应当在p和q都为真时精确计算为true。仅使用函数应用程序和lambda表达式。
(define (and p q)
(if eq? p q)
((true #t #f)
((false) #t #f)))
答案 0 :(得分:1)
请注意and
是一种具有不同评估规则的特殊表单,我们无法仅使用过程真正实现它:我们需要特殊的语法 - 例如,通过使用宏定义它。要看到这一点,请注意,当我们执行此操作时,内置特殊格式and
将不引发错误:
(and #f (/ 1 0))
=> #f
如果我们将and
写为一个过程,上面的行将导致错误,因为第二个参数实际上是在调用过程之前评估的:
(and #f (/ 1 0))
=> /: division by zero
既然上面已经清楚了,请记住在Scheme中唯一的错误值是#f
,其他一切都被认为是真实的。考虑到这一点,使用两个参数调用的标准and
特殊表单的行为如下(忽略评估规则中的差异),请注意表达式的值是q
的值,除非{ {1}}是假的:
p
但是如果我们想要强制只返回true或false值,我们必须改变最后一行:
(define (and p q)
(if (false? p)
p
q))
答案 1 :(得分:0)
如果变量p
的值为#f
并且可以在if
中使用,则变量(define (and-function p q)
(if p
q
#f))
为false:
p
这检查了q
是否属实。如果是,则结果为#f
。如果不是,则结果应为p
,与and
相同。
知道Scheme中的{{1}}是短路而不是功能,但我想你的书会来。