我不明白方案评估的例子

时间:2014-03-01 21:57:09

标签: scheme mit-scheme

我是Scheme语言的新手。我正在阅读“简单方案”一书并且遇到了下一个例子:

(cond (empty? 3)
      (square 7)
      (else 9))

当我运行它时,我得到3.我知道每个cond表达式需要2个args:一个用于条件的“eval”,第二个是“答案”。评估在哪里,答案在哪里?为什么?

3 个答案:

答案 0 :(得分:2)

这是一个真实的例子。

正如您所理解的,每个子句都有条件结果。条件是:为空? square else 。答案是 3 7 9

cond会查找评估为#t的第一个条件。在Scheme中,除#t外,所有内容均为#f。所以第一个条件评估为true:

> (if empty? "true" "false")
"true"

cond会返回第一个结果 3

答案 1 :(得分:1)

编写cond表达式的正确方法如下:

(cond ((even? 3) 3)
      ((odd?  5) 5)
      (else -1))

所以你看,谓词表达式在每个子句的左边部分,如果它们中的任何一个为真,则评估其右边的表达式,返回最后一个值;在上面的示例中,返回5

关于你的代码,这就是正在发生的事情:empty?函数被视为#t(因为在Scheme中任何未明确#f的东西都被认为是真的),所以第一个子句是为true,将评估并返回其右侧的表达式,恰好是3。您可以轻松验证此行为,例如,以下代码段将返回"ok",因为函数名称empty?再次被视为true:

(if empty? "ok" "not ok")

答案 2 :(得分:1)

cond的语法是:

(cond <clause1> <clause2> …)

其中的条款是:

(<test> <expression1> …)

(<test> => <expression>)

,最后<clause>可以是(else <expression1> <expresssion2> …)。因此,忽略=>情况,cond表达式如下所示:

(cond (<test> <exp1> <exp2> …)
      … 
      (else   <exp1> <exp2> …))

如果你将其与你的表达相匹配:

(cond (empty? 3)
      (square 7)
      (else 9))

您会看到标识符empty?<test>,如果绑定了empty?,它将始终为true。标识符square是另一个<test>。那不是你想要的。