Racket 编译器不';康德不抱怨';没有其他分支,条件为';我不满意
我有以下球拍代码:Racket 编译器不';康德不抱怨';没有其他分支,条件为';我不满意,racket,Racket,我有以下球拍代码: #lang racket (define (for-each proc items) (cond ((not (null? items)) (proc (car items)) (for-each proc (cdr items))))) (for-each (lambda (x) (newline) (display x)) (list 57 321 88)) 因为88打印出来后条件不满足,球拍的文件上写着: 如果没有一个问题表达式
#lang racket
(define (for-each proc items)
(cond ((not (null? items))
(proc (car items))
(for-each proc (cdr items)))))
(for-each (lambda (x) (newline) (display x))
(list 57 321 88))
因为88打印出来后条件不满足,球拍的文件上写着:
如果没有一个问题表达式的计算结果为true,则cond的值是else子句的答案表达式。如果没有其他错误,cond将报告错误
因此,预期结果是一个错误,但我得到了正确的输出:
57
321
88
谁能告诉我为什么?(注:我正在使用DrRacket 6.2)我不知道你从哪里得到的信息。引述: 一秒钟内的最后一个测试表达式可以替换为else。就评估而言,else是#t的同义词,但它澄清了最后一个从句是为了涵盖所有剩余的情况。如果未使用else,则可能没有测试表达式生成真值;在这种情况下,cond表达式的结果是#void
我不知道你从哪里得到的信息。引述: 一秒钟内的最后一个测试表达式可以替换为else。就评估而言,else是#t的同义词,但它澄清了最后一个从句是为了涵盖所有剩余的情况。如果未使用else,则可能没有测试表达式生成真值;在这种情况下,cond表达式的结果是#void
稍微更改缩进:
(define (for-each proc items)
(cond
[(not (null? items)) (proc (car items))
(for-each proc (cdr items))]))
呼叫(针对每个f(列表1、2、3))
将调用函数并将proc
绑定到f
和项
绑定到”(1 2 3)
测试(非(空?项))
为真,因为”(1 2 3)
为非空。
因此,对右侧进行评估。右手边做两件事:
1.(proc(car项目))
使用列表中的第一个元素调用f
(这里是1),然后是2)。调用(对于每个过程(cdr项))
。此处(cdr项目)
变为“(2 3)
最终,每个的将被调用为(每个f'())
。
此时(not(null?items))
将计算为#f
,而条件将尝试下一个子句。由于没有更多的子句,cond
将返回void
文件说:
If no cond-clauses are present, the result is #<void>.
如果不存在cond子句,则结果为#。
注意:教学语言中的cond
将返回错误。教学语言中的结构通常会报告错误,有可能射伤自己的脚。稍微更改缩进:
(define (for-each proc items)
(cond
[(not (null? items)) (proc (car items))
(for-each proc (cdr items))]))
呼叫(针对每个f(列表1、2、3))
将调用函数并将proc
绑定到f
和项
绑定到”(1 2 3)
测试(非(空?项))
为真,因为”(1 2 3)
为非空。
因此,对右侧进行评估。右手边做两件事:
1.(proc(car项目))
使用列表中的第一个元素调用f
(这里是1),然后是2)。调用(对于每个过程(cdr项))
。此处(cdr项目)
变为“(2 3)
最终,每个
的将被调用为(每个f'())
。
此时(not(null?items))
将计算为#f
,而条件将尝试下一个子句。由于没有更多的子句,cond
将返回void
文件说:
If no cond-clauses are present, the result is #<void>.
如果不存在cond子句,则结果为#。
注意:教学语言中的cond
将返回错误。教学语言中的结构通常会报告错误,即有可能射中自己的脚。在R6RS中,如果您引用了错误的文档,它会返回“unspecified”。它说:如果不存在cond子句,结果是#。请参阅:另请参阅:在R6RS中,如果您引用了错误的文档,它将返回“unspecified”。它说:如果不存在cond子句,结果是#。请看:也请看:我是指Dash中的文档,它就是这么说的。但是如果它应该产生一个#void
,那么输出应该有一个#void
,但是在我的输出中只有三个数字。@Caesar#void
应该是每个的返回值,它是。但是,由于您从未为每个
打印的返回值,因此没有理由将其显示在输出中。但是在Scheme中,即使我不手动打印,不是也会自动打印每个返回值吗?就像我写(列表12)
并运行它一样,输出将是(12)
。但是看看这个,它说编译器将报告一个错误。@Caesar strange-我会问周围的人我是指Dash中的文档,它就是这么说的。但是如果它应该产生一个#void
,那么输出应该有一个#void
,但是在我的输出中只有三个数字。@Caesar#void
应该是每个的返回值,它是。但是,由于您从未为每个
打印的返回值,因此没有理由将其显示在输出中。但是在Scheme中,即使我不手动打印,不是也会自动打印每个返回值吗?就像我写(列表12)
并运行它一样,输出将是(12)
。但是看看这个,它说编译器将报告一个错误。@Caesar strange-我会问一下周围的问题#void
是否应该打印出来?@Caesar值#void
在打印方面是特别的。打印机从不打印单个#void
。如果将其放入列表(list(void))
,它将打印它。当您不想返回任何内容时,会返回void值,因此不想打印任何内容。但请看,它表示编译器将报告错误。是的,该链接指向教学语言“Advanced”的文档。在教学语言中,你会得到一个“条件:所有问题”