我尝试写一个(简单的,即没有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)))))
为什么需要将cond
与else
子句一起使用,而不是只返回(= 1 n)
?
答案 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;
}
}