Scheme &引用;条件“&引用;及;及;或;计划中

Scheme &引用;条件“&引用;及;及;或;计划中,scheme,Scheme,我在读《小阴谋家》。多亏了我蹩脚的英语,我被这段话弄糊涂了: (cond…)也具有不考虑其所有 论据。但是,由于该属性,无论是(和…)还是 (或…)可以定义为(cond…)方面的函数 (和…)和(或…)都可以表示为 (条件…)-表达方式: (and a b) = (cond (a b) (else #f) and (or a b) = (cond (a #t) (else (b)) 如果我理解正确,它说(and…)和(or…)可以被(cond…)表达式替换,但不能定义为包含(con

我在读《小阴谋家》。多亏了我蹩脚的英语,我被这段话弄糊涂了:

(cond…)也具有不考虑其所有 论据。但是,由于该属性,无论是(和…)还是 (或…)可以定义为(cond…)方面的函数 (和…)和(或…)都可以表示为 (条件…)-表达方式:

(and a b) = (cond (a b) (else #f) 
    and 
(or a b) = (cond (a #t) (else (b))
如果我理解正确,它说(and…)和(or…)可以被(cond…)表达式替换,但不能定义为包含(cond…)的函数。为什么会这样?这和变量参数有关吗?谢谢


p、 我做了一些搜索,但只发现(cond…)在其条件之一计算为#f时忽略表达式。

您不能将
cond
if
定义为函数,因为函数计算其所有参数。(可以将其中一些定义为宏)


另请阅读著名的and(法语)。

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


还可以阅读著名的and(法语)。

想象一下,您将
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?
中,在执行
my if
主体之前,对
(不是(对x))
#t
#f
部分进行了评估

对于最后一个示例,这意味着无论a是什么,都会计算
(add(-a1)(+b1))
,即使
a
为零,因此过程永远不会结束

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

(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的程序版本。这就是
以及
的实现方式。

假设您将
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?
中,在执行
my if
主体之前,对
(不是(对x))
#t
#f
部分进行了评估

对于最后一个示例,这意味着无论a是什么,都会计算
(add(-a1)(+b1))
,即使
a
为零,因此过程永远不会结束

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

(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的程序版本。这就是
以及
的实现方式。

谢谢!这本书很棒,只是它没有讲太多关于语言的细节。谢谢!这本书很棒,只是它没有讲太多关于语言的细节。谢谢!这本书很棒,只是它没有告诉你太多关于语言的细节。除了你在这里得到的答案,你可以看看和的答案。问题的主题与您的问题略有不同,但答案解释了一些相同的概念。谢谢!这两篇文章很有启发性。现在我想我需要阅读SICP。它非常值得一读,而且是。除了你在这里得到的答案,你可以看看和的答案。问题的主题与您的问题略有不同,但答案解释了一些相同的概念。谢谢!这两篇文章很有启发性。现在我想我需要阅读SICP。它非常值得一读,而且是。除了你在这里得到的答案,你可以看看和的答案。问题的主题与您的问题略有不同,但答案解释了一些相同的概念。谢谢!这两篇文章很有启发性。现在我想我需要读一下SICP。它很值得一读,而且很有趣。