2013-04-22 55 views
1

问候,我是新来的所以请照顾我。简单计划练习。第06章对与错

锻炼6.1Simply Scheme有表达:

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

我的心说,这应该评估(方7)并返回。 (空??3)将被评估(返回原子 - 尝试与其他原子和列表,同样的交易)。

我很困惑。

我所知道的:在方案

  1. 的一切,是不是假的是真的。如果3为真且不为空(#f),为什么cond表达式返回(空?3)?
  2. 对cond表达式的第一个参数进行评估,如果它为true,则返回#t,定义的值或依赖于上下文的#undefined。如果为false,则继续评估cond参数,直到它发生(或找不到合适的返回值),然后退出cond。

我不知道是什么:

  1. (?空3)对自己的回报#F。为什么cond在这里终止而不是评估(方块7)?
  2. 为什么在cond中(空的?3)的评估返回原子,而不是#t或#f?

我正在使用带Slib的SCM和Simply Scheme提供的附加库(简单的.scm,函数.scm,ttt.scm,match.scm,database.scm)。

空吗?在simple.scm中的定义超出了我在这一点上的方案把握。

+0

你仍然可以发布'empty?'的定义?这些库很难找到。 – 2013-04-22 10:28:16

+0

@ [larsmans](http://stackoverflow.com/users/166749/larsmans)当然。[简单]中的函数定义(http://www.eecs.berkeley.edu/~bh/downloads/simply/simply.scm)。整个[图书馆](http://www.eecs.berkeley.edu/~bh/downloads/simply/)。 – usernvk 2013-04-22 12:42:49

回答

2

cond形式是这样的:

(cond (something-to-check-for-truthiness value-if-truthiness-succeed) 
     ...other checks in the same format as above ) 

现在,如果你把你的代码格式即可。 empty?即只是功能为空(不是它的调用)适合于something-to-check-for-truthiness的地方,并且功能总是一个真值,因此返回的3是在empty?之后并且适合于value-if-truthiness-succeed时隙。所以,根本没有呼叫empty?功能。

+0

@ [ankur](http://stackoverflow.com/users/553209/ankur)我阅读你的解释并立即得到它。经过数周的跋涉进入第15章,收集了可怕的嵌套if表达式。为什么不是这样的书? – usernvk 2013-04-22 12:40:06

+1

如果你已经把它与其他'cond'例子进行了比较,那么你可能已经有了它,当你练习更多的时候,你的大脑的s表达式解析能力将会增加,然后这个世界就会在你的脚上:) – Ankur 2013-04-22 12:50:39

+0

你可能是对的,哈哈随着时间的推移,双括号让我倍感欣慰。现在清楚,白天,谢谢你的小部分。另外,我有3个代表。我可以+1吗?怎么样? – usernvk 2013-04-22 13:10:38

1

这不是什么cond做的。 cond接受一个或多个参数,每个参数必须是方案表达式的列表。

(cond(#t))是一个有效的cond语句。

它评估第一个表达式,如果为true,则评估该列表中的许多附加s-epressions,并返回最后一个评估表达式的值。

(条件(#T 1 2 3 4(如果(号码是多少?0) “是啊,理智!” “它磨它的皮肤洗剂”)))是一个有效的COND声明

+0

哈哈,用这个'((lambda(测试)(cond(测试1 2 3 4“是啊,理智!”“它擦皮肤上的润肤液”)(否则(退出))))#f)'真的很对。认为两个表达式的每个cond参数都有一个限制。奇怪的行为。这有用吗?我的意思是,你的例子中的'1 2 3 4'被评估,但不影响cond返回值。看起来像是浪费,特别是如果它是CPU密集型的程序。 – usernvk 2013-05-01 02:41:32

+1

@usernvk是的,在一个纯函数中,只有一个或两个表达式是有用的,但如果每个中间表达式产生副作用,比如写入文件,打印屏幕或调用某种组!程序。 – WorBlux 2013-05-02 23:07:21