我正在通过 SICP 工作,我正在进行的练习要求一个返回列表中最后一个元素的过程。我实现了执行last-pair
此操作的过程,但我很困惑为什么它返回一个列表而不是一个数字:
(define (last-pair alist)
(cond ((null? (cdr alist))
(car alist)) ; still happens if this is just "car alist)"
(else
(last-pair (cdr alist)))))
当我在从 1 到 5 的整数列表上调用它时,我得到输出 '(5):
> (last-pair (list 1 2 3 4 5))
'(5)
我原以为5
,怎么(car (list 1 2 3 4 5))
会1
不回来'(1)
。
为什么我得到'(5)
而不是5
?
我正在使用 DrRacket 5.3.3 和 Racket Scheme。
编辑 1:MIT-Scheme 似乎没有这样做。last-pair
返回5
不'(5)
。哪个是对的?!?
编辑 2:有趣的是,在 DrRacket 中(不在 MIT-Scheme 中),如果第二行(cond ((null? (cdr alist))
缩进两个空格,则在调用过程时,它返回'(5)
. 但是,当第二行没有缩进时,它会返回5
. 这是一个故障吗?我相信 Scheme 解释器应该遵循的只是括号,对吗?
编辑 3:我开始认为这是 DrRacket 中的一个小故障。当我将过程定义放在定义窗口(通常是顶部编辑器窗格)中时,无论缩进如何,过程都将返回5
. 但是,如果我在界面窗口中定义它,缩进会影响编辑 2 中所述的结果。(编辑 4)无论缩进如何,它都会返回'(5)
.
<用一些关于缩进差异的代码剪断了前面的部分;现在的问题是定义过程的地方,请参阅编辑 4 >
编辑4:好的,我已经简化了问题。
- 在 MIT-Scheme 中,
(last-pair (list 1 2 3 4 5))
返回5
,其中last-pair
定义如上。不管缩进。 - 在 DrRacket 中,当
last-pair
程序在定义窗口中定义时,然后我单击“运行”,(last-pair (list 1 2 3 4 5))
返回5
. 不管缩进。 - 在 DrRacket 中,当
last-pair
程序在界面窗口(REPL)中定义时,(last-pair (list 1 2 3 4 5)) returns
'(5). 不管缩进。
这是一个屏幕截图: