2

我在读小计划者。由于我的英语不好,我被这段话弄糊涂了:

(cond ... ) 还具有不考虑所有论点的特性。然而,由于这个性质, (and ... ) 和 (or ... ) 都不能定义为根据 (cond ... ) 的函数,尽管 (and ... ) 和 (or ... ) 可以表示为 (cond ... ) 表达式的缩写:

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

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

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

4

2 回答 2

7

想象一下,您将其编写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并在执行#f主体之前进行了评估my-if

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

您可以使用语法制作自己的 if:

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

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

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

将被替换为:

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

使用程序版本my-if10 和 20 将被打印。这也是如何and实现or的。

于 2013-10-14T12:21:45.300 回答
1

您不能将condorandoror定义if函数,因为函数会评估其所有参数。(您可以将其中一些定义为宏)。

另请阅读著名的SICPLisp In Small Pieces(法语原文)。

于 2013-10-14T04:55:41.997 回答