0

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

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

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

4

3 回答 3

2

不是一个真实的例子。

正如您正确理解的那样,每个子句都有一个条件和一个结果。条件是:空?,正方形等。_ 答案是379

cond将寻找计算结果为 的第一个条件#t。在 Scheme 中,一切都是#texcept #f。所以第一个条件评估为真:

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

cond返回第一个结果3

于 2014-03-01T22:06:00.933 回答
1

的语法cond是:

(cond <clause1> <clause2> …)

where 子句是:

(<test> <expression1> …)

或者

(<test> => <expression>)

最后一个<clause>可以(else <expression1> <expresssion2> …)。因此,忽略=>大小写,cond表达式如下所示:

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

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

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

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

于 2014-03-02T15:33:44.183 回答
1

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

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

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

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

(if empty? "ok" "not ok")
于 2014-03-01T22:05:48.710 回答