我是 Scheme 语言的新手。我正在阅读“简单方案”一书,并遇到了下一个示例:
(cond (empty? 3)
(square 7)
(else 9))
当我运行它时,我得到了 3。我知道每个 cond 表达式需要 2 个参数:一个用于条件的“eval”,第二个是“答案”。评估在哪里,答案在哪里?为什么 ?
我是 Scheme 语言的新手。我正在阅读“简单方案”一书,并遇到了下一个示例:
(cond (empty? 3)
(square 7)
(else 9))
当我运行它时,我得到了 3。我知道每个 cond 表达式需要 2 个参数:一个用于条件的“eval”,第二个是“答案”。评估在哪里,答案在哪里?为什么 ?
这不是一个真实的例子。
正如您正确理解的那样,每个子句都有一个条件和一个结果。条件是:空?,正方形等。_ 答案是3、7和9。
cond
将寻找计算结果为 的第一个条件#t
。在 Scheme 中,一切都是#t
except #f
。所以第一个条件评估为真:
> (if empty? "true" "false")
"true"
并cond
返回第一个结果3。
的语法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>
. 那不是你想要的。
编写表达式的正确方法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")