Scheme &引用;条件“&引用;及;及;或;计划中
我在读《小阴谋家》。多亏了我蹩脚的英语,我被这段话弄糊涂了: (cond…)也具有不考虑其所有 论据。但是,由于该属性,无论是(和…)还是 (或…)可以定义为(cond…)方面的函数 (和…)和(或…)都可以表示为 (条件…)-表达方式: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
(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。它很值得一读,而且很有趣。