方案中的“cond”,“and”和“or”

时间:2013-10-14 04:52:44

标签: scheme

我在读 The Little Schemer 。由于我的英语水平不好,我对这一段感到困惑:

  

(cond ...)也有不考虑所有的财产   参数。但是,由于这个属性,既没有(和......)也没有   但是,(或......)可以用(cond ...)来定义为函数   (和......)和(或......)都可以表示为。的缩写   (cond ...) - 表达:

(and a b) = (cond (a b) (else #f) 
    and 
(or a b) = (cond (a #t) (else (b))

如果我理解正确,它说(和......)和(或......)可以用(cond ...)表达式替换,但不能定义为包含的函数(cond .. )。为什么会这样?它与变量参数有什么关系吗?感谢。

P.S。我做了一些搜索,但只发现(cond ...)在其中一个条件评估为#f时忽略表达式。

2 个答案:

答案 0 :(得分:5)

想象一下,您将if写为函数/过程而不是用户定义的宏/语法:

;; makes if in terms of cond
(define (my-if predicate consequent alternative)
  (cond (predicate consequent)
        (else alternative)))

;; example that works
(define (atom? x)
  (my-if (not (pair? x))
         #t
         #f))

;; example that won't work
;; peano arithemtic
(define (add a b)
  (my-if (zero? a)
         b
         (add (- a 1) (+ b 1))))

my-if的问题在于,作为一个过程,每个参数都会在过程体执行之前得到评估。因此,atom?部分(not (pair? x))#t#fmy-if的主体执行之前进行了评估。

对于最后一个示例,无论什么是(add (- a 1) (+ b 1)),即使a为零,也会对其进行评估,因此该过程将永远不会结束。

您可以使用语法创建自己的:

(define-syntax my-if
  (syntax-rules ()
    ((my-if predicate consequent alternative)
     (cond (predicate consequent)
           (else alternative)))))

现在,您如何阅读本文的第一部分是一个模板,其中谓词结果和替代表示未评估的表达式。它被另一个替换,只是重用表达式,以便:

(my-if (check-something) (display 10) (display 20))

将被替换为:

(cond ((check-something) (display 10))
      (else (display 20)))

使用my-if的程序版本,将打印10和20。这也是andor的实施方式。

答案 1 :(得分:1)

您无法将condandorif定义为函数,因为函数会评估所有参数。 (您可以将其中一些定义为宏)。

另请阅读着名的SICPLisp In Small Pieces(法语original)。