3

我试图编写一个(简单,即没有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)))))

为什么需要使用condwithelse子句,而不仅仅是返回(= 1 n)

4

2 回答 2

6

你没有任何理由想要这样做。当我回到家时,我会检查我的 TLS 副本,看看我是否能猜出发生了什么,但你不会错过任何基本的cond东西或任何东西。

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

(lambda (n) (= 1 n))

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

于 2009-12-28T21:39:13.277 回答
0

手头没有The Little Schemer的副本,您的示例看起来应该可以工作。我认为这cond是无关紧要的。在伪 C 中,等价物(带 cond)是:

int
one(int n)
{     
    switch (foo) {
        default:
           return  1 == n;
    }
}
于 2009-12-28T21:43:30.667 回答