当省略'else'时,Scheme'cond'子句会发生什么?
题
我正在学习Scheme。我最近花了(太多!)时间试图找到程序中的错误,然后才意识到我错过了cond子句中的'else'字样。但在这种情况下的行为似乎有点奇怪。只用一个简单的程序(下面)试验条件,'else'在else子句中按预期显示,但也会显示,但没有'else',会显示周围的双引号和未解释的新引号字面打印。任何人都可以向我解释发生了什么事吗? TIA。
(define (foo x)
(cond ((eq? x 0) (display "zero\n"))
(display "whatever\n")))
(define (bar x)
(cond ((eq? x 0 ) (display "zero\n"))
(else (display "whatever\n"))))
In the repl window:
Welcome to DrScheme, version 4.1.5 [3m].
Language: Pretty Big; memory limit: 128 megabytes.
> (foo 0)
zero
> (bar 0)
zero
> (foo 2)
"whatever\n"
> (bar 2)
whatever
>
解决方案
"否则"只是“真实”的同义词。读取cond的方法是作为一系列测试,其中第一个测试是真的导致要评估表单。
(cond ( (test) (do this) )
( (test) (do this) ) )
这是你的第一个
(cond ((eq? x 0) (display "zero\n"))
(display "whatever\n")))
cond查看(eq?x 0)
并确定为false。下一个子句是(显示" whatever \ n")
。它查看 display
,因为 display
不是 nil
,所以这是真的。然后它评估字符串" whatever \ n"
,它只是评估自己。因此,cond的值是" whatever \ n"
。
现在,这是你的第二个:
(cond ((eq? x 0 ) (display "zero\n"))
(else (display "whatever\n"))))
这里,第一个测试是假的,然后继续进行第二个测试,即 else
,其评估结果为true。 (如果你考虑一下,那就是“else”在正常的if-then-else中意味着什么:“对于以前没有任何测试都是真的所有情况都是真的。”
现在,它后面的表格是(显示“无论什么\ n”)
。这是一个将字符串参数发送到控制台并且不返回任何内容的函数,因为这就是显示器正在执行的操作。在另一个方案中,它可能返回其字符串值以及打印它,在这种情况下,您将看到
whatever
"whatever\n"
其他提示
在 foo
函数中, cond
语句将 display
评估为要测试的条件。由于确实存在一个名为 display
的符号,因此它的计算结果为true,因此" whatever \ n"
将被计算为(foo 2)的结果代码>