10

我正在学习Scheme。我最近花了(太多!)时间试图找到程序中的错误,然后才意识到我在 cond 子句中错过了“else”词。但是在这种情况下的行为似乎有点奇怪。只用一个简单的程序(如下)试验条件,“whatever”会在 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
> 
4

2 回答 2

19

“else”只是“true”的同义词。读取 cond 的方法是一系列测试,其中第一个为真的测试会导致对该表单进行评估。

(cond  ( (test) (do this) )
       ( (test) (do this) ) )

这是你的第一个

 (cond ((eq? x 0) (display "zero\n"))
        (display "whatever\n")))

cond 看着(eq? x 0)并确定这是错误的。下一个子句是(display "whatever\n")。它看起来display,因为display不是nil,所以它是真的。然后它评估 string "whatever\n",它只是评估自己。所以 cond 的值是 then "whatever\n"

现在,这是你的第二个:

(cond ((eq? x 0 ) (display "zero\n"))
       (else (display "whatever\n"))))

在这里,第一个测试是假的,它继续到第二个测试,它是else并且评估为真。(如果你想一想,这就是“else”在正常的 if-then-else 中的含义:“对于所有以前的测试都不为真的情况下为真。”)

现在,它后面的形式是(display "whatever\n")。这是一个将字符串参数发送到控制台并且不返回任何内容的函数,因为这是 display 发生的事情。在另一种方案中,它可能会返回其字符串值并打印它,在这种情况下您会看到

whatever
"whatever\n"
于 2009-05-01T22:52:11.203 回答
10

foo函数中,cond语句评估display为要测试的条件。因为确实有一个叫做 的符号display,它的计算结果为真,所以"whatever\n"然后计算 的结果(foo 2)

于 2009-05-01T22:43:02.893 回答