方案和定义

时间:2017-03-13 02:19:44

标签: scheme

定义一个过程"和",为我们的过程实现布尔和函数true和false - (test(和p q))应当在p和q都为真时精确计算为true。仅使用函数应用程序和lambda表达式。

(define (and p q)
   (if eq? p q)
     ((true #t #f)
     ((false) #t #f)))

2 个答案:

答案 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}}是短路而不是功能,但我想你的书会来。