代码之家  ›  专栏  ›  技术社区  ›  Leonard

省略“else”时,方案“cond”子句中会发生什么?

  •  9
  • Leonard  · 技术社区  · 15 年前

    我正在学习计划。我最近花了(太多!)在我意识到在cond子句中缺少“else”这个词之前,尝试在程序中查找错误的时间。但这种情况下的行为似乎有点奇怪。用一个简单的程序(如下)来试验条件,“whatever”将按预期在else子句中显示,但也将显示,但不显示“else”,将显示周围的双引号和未解释的新行。有人能告诉我发生了什么事吗?短暂性脑缺血发作

       (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
    > 
    
    2 回复  |  直到 14 年前
        1
  •  17
  •   Charlie Martin    15 年前

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

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

    这是你的第一个

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

    康德看着 (eq? x 0) 并认定这是错误的。下一条是 (display "whatever\n") . 它看起来 display 以及以后 显示 不是 nil 这是真的。然后计算字符串 "whatever\n" 只对自身进行评估。那么cond的值就是 “无论什么” .

    现在,给你第二个:

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

    这里,第一个测试是错误的,接着是第二个测试,也就是 else 它的评价是真的。(如果你想一想,“其他”在正常的if-then-else中就是这样的意思:“所有以前的测试都不是真的情况下都是真的。”)

    下面的表格是 (显示“whatever \n”) .这是一个函数,它将字符串参数发送到控制台,但不返回任何内容,因为显示就是这样做的。在另一个方案中,它可能返回其字符串值并打印它,在这种情况下,您将看到

    whatever
    "whatever\n"
    
        2
  •  9
  •   Greg Hewgill    15 年前

    foo 函数 cond 语句计算 display 作为测试条件。因为确实有一个符号叫做 显示 ,它的计算结果为真,因此 "whatever\n" 然后作为 (foo 2) .