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”的文档。在教学语言中,你会得到一个“条件:所有问题”