我是Scheme语言的新手。我读了“简单计划”一书,并在整个下一个例子就是:我不明白方案评估示例
(cond (empty? 3)
(square 7)
(else 9))
当我运行它,我得到了3我知道,每个COND表达需要服用2个ARGS:一为“EVAL”条件,第二个是“答案”。 eval在哪里?答案在哪里?为什么?
我是Scheme语言的新手。我读了“简单计划”一书,并在整个下一个例子就是:我不明白方案评估示例
(cond (empty? 3)
(square 7)
(else 9))
当我运行它,我得到了3我知道,每个COND表达需要服用2个ARGS:一为“EVAL”条件,第二个是“答案”。 eval在哪里?答案在哪里?为什么?
这是不是一个真实的例子。
正如您正确理解的那样,每个子句都有条件和结果。条件是:空?,square and else。答案是,和。
cond
将查找评估为#t
的第一个条件。在计划中,除#f
之外的所有内容均为#t
。所以第一个条件计算为真:
> (if empty? "true" "false")
"true"
和cond
返回的第一个结果,。
写cond
表达正确的方法是这样的:
(cond ((even? 3) 3)
((odd? 5) 5)
(else -1))
所以你看,谓词表达式是每个子句的左侧部分,如果其中任何一个为真,则表达式的对权利进行评估,返回最后一个值;在上面的例子中返回5
。
关于你的代码,这是发生了什么:在empty?
函数作为#t
(因为在计划什么,这不是明确#f
被认为是真实的),所以第一条是真实的表达,它的权评估,返回,这恰好是3
。您可以轻松地验证此行为,比如因为再次函数名称empty?
被认为是真正的下列片段将返回"ok"
:
(if empty? "ok" "not ok")
的语法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?
,标识符,是一个<test>
这将永远如果empty?
被绑定,那么这是真的。标识square
是另一个<test>
。这不是你想要的。
问题中的原始代码也是编写cond语句的正确方法。 – WorBlux
@WorBlux语法上是的,但它是无用的条件 - 第一个条件将永远是真实的(除非'empty?'被绑定到'#f',但仍然...) –