2013-04-24 55 views
2

我是一个新手,我试图编写一个总是找到列表的尾部第一个元素的过程。这在递归调用中很重要。创建一个程序,它将列表作为参数

这里是我的方法:

(define second (lambda (x) (car(cdr(x)))) 

,这是我如何努力,以检查其是否运行正常与否:

>(define x (list 1 2 3 4)) 
>(second x) 

,这是错误:

procedure application: expected procedure, given: (1 2 3 4) (no arguments) 

=== context === 
stdin::184: second 
/usr/share/racket/collects/racket/private/misc.rkt:85:7 

可能是什么问题?你能给我一个灵感吗?我对“第二”的定义是错的还是什么?

在此先感谢。

+0

你在DrRacket中运行这个吗?如果是这样,您应该在发生错误的地区看到红色突出显示。你看到这个了吗? – dyoo 2013-04-24 21:55:06

+0

不,我试图在终端上 – user2870 2013-04-24 22:24:08

+0

如果可以,请尝试使用DrRacket运行;当你学习语言时,它提供的额外支持应该很有用。 – dyoo 2013-04-25 03:36:32

回答

3

在代码中有一个额外的,不必要的一对括号。这解决了它:

(define second (lambda (x) (car (cdr x)))) 

要清楚,这是错误的:(cdr(x))。正确的形式是:(cdr x)。请记住,无论何时您需要将函数f应用于参数x正确的方法是:(f x)

+0

非常感谢你。我真的很感激你:) – user2870 2013-04-24 21:56:22

+0

永远是我的荣幸:) – 2013-04-24 21:58:22

0

Scheme使用S表达式,因此而不是car(x),您应该使用(car x)。在你的情况下,这意味着(car (cdr x)),而不是car(cdr(x))

相关问题