2009-12-28 84 views
3

我试着写一个(简单的,即没有eqan?one?功能就像这样:方案:为什么在这里需要使用cond?

(define one? 
    (lambda (n) 
    ((= 1 n)))) 

但上面没有,但因为工作时,我把它称为像这样:

(one? 1) 

我迎接得到与此错误:

procedure application: expected procedure, given: #t (no arguments) 

正确的方法(从的小策士)写的是:

(define one? 
    (lambda (n) 
    (cond 
     (else (= 1 n))))) 

为什么有必要使用condelse条款,而不是只返回(= 1 n)

回答

6

你没有任何理由要这样做。当我回家时,我会检查我的TLS副本,看看我是否能够理解正在发生的事情,但是你不会错过任何关于cond或任何其他事情的基本知识。

对上述注意事项的回应:它不起作用,因为您在lambda主体中有一组额外的圆括号。它应该是

(lambda (n) (= 1 n)) 

在您的版本额外的括号意味,而不是返回值#t#f,你要调用该值作为不带参数的函数。

+0

* 79 *页(第4版) – 2009-12-28 21:52:12

+0

+1烨,这个问题是因为我有额外的括号;感谢您的解释。 – 2009-12-28 22:41:47

+2

......哦,不,我刚刚意识到,如果我在提问之前查看了5厘米的页面,我会在书的同一页面看到没有'cond'的'one?'功能;学习到教训了。 – 2009-12-28 22:53:25

0

没有副本Little Schemer得心应手,你的例子看起来好像应该工作。我认为cond是无关的。在psudeo-C的equivant(与COND)是:

int 
one(int n) 
{  
    switch (foo) { 
     default: 
      return 1 == n; 
    } 
}