我是Scheme语言的新手。我正在阅读“简单方案”一书并且遇到了下一个例子:
(cond (empty? 3)
(square 7)
(else 9))
当我运行它时,我得到3.我知道每个cond表达式需要2个args:一个用于条件的“eval”,第二个是“答案”。评估在哪里,答案在哪里?为什么?
答案 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>
。那不是你想要的。