2014-03-01 149 views
0

我是Scheme语言的新手。我读了“简单计划”一书,并在整个下一个例子就是:我不明白方案评估示例

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

当我运行它,我得到了3我知道,每个COND表达需要服用2个ARGS:一为“EVAL”条件,第二个是“答案”。 eval在哪里?答案在哪里?为什么?

回答

2

这是不是一个真实的例子。

正如您正确理解的那样,每个子句都有条件结果。条件是:空?,square and else。答案是,和。

cond将查找评估为#t的第一个条件。在计划中,除#f之外的所有内容均为#t。所以第一个条件计算为真:

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

cond返回的第一个结果,。

1

cond表达正确的方法是这样的:

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

所以你看,谓词表达式是每个子句的左侧部分,如果其中任何一个为真,则表达式的对权利进行评估,返回最后一个值;在上面的例子中返回5

关于你的代码,这是发生了什么:在empty?函数作为#t(因为在计划什么,这不是明确#f被认为是真实的),所以第一条是真实的表达,它的权评估,返回,这恰好是3。您可以轻松地验证此行为,比如因为再次函数名称empty?被认为是真正的下列片段将返回"ok"

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

问题中的原始代码也是编写cond语句的正确方法。 – WorBlux

+0

@WorBlux语法上是的,但它是无用的条件 - 第一个条件将永远是真实的(除非'empty?'被绑定到'#f',但仍然...) –

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?,标识符,是一个<test>这将永远如果empty?被绑定,那么这是真的。标识square是另一个<test>。这不是你想要的。