方案:为什么需要在这里使用cond?

时间:2009-12-28 21:36:04

标签: scheme the-little-schemer

我尝试写一个(简单的,即没有eqan?one?函数,如下所示:

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

但是上面的说法不起作用,因为当我把它称之为:

(one? 1)

我受到了这个错误的欢迎:

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

编写它的正确方法(来自 The Little Schemer )是:

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

为什么需要将condelse子句一起使用,而不是只返回(= 1 n)

2 个答案:

答案 0 :(得分:6)

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

回复上面的注释:它不起作用,因为你在lambda的主体中有一组额外的括号。它应该是

(lambda (n) (= 1 n))

您的版本中的额外括号意味着您不是返回值#t#f,而是尝试将该值称为不带参数的函数。

答案 1 :(得分:0)

没有 The Little Schemer 的副本,你的例子看起来好像应该有效。我认为cond是无关紧要的。在psudeo-C中,等效(与cond)是:

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