我正在通过SICP工作,并且我正在进行的练习要求提供返回列表中最后一个元素的过程。我实现了程序last-pair
要做到这一点,但我很困惑,为什么它返回一个列表,而不是一个数字:为什么这会返回一个列表'(5)而不是数字5?
(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和球拍方案。
编辑1:麻省理工学院计划似乎没有这样做。 last-pair
返回5
而不是'(5)
。哪个是对的?!?
编辑2:有趣的是,在DrRacket(未在MIT-计划),如果第二线(cond ((null? (cdr alist))
缩进两个空间,当程序被调用时,它返回'(5)
。但是,当第二行不缩进时,它将返回5
。这是一个小故障?我相信所有这些Scheme解释器都应该遵循的是括号,对吗?
编辑3:我开始认为这是DrRacket中的一个小故障。当我将过程定义放置在定义窗口(通常是最上面的编辑器窗格)时,无论是否缩进,过程将返回5
。但是,如果我在界面窗口,中定义它,则缩进会影响编辑2中所述的结果(编辑4),不管缩进是多少,它都会返回'(5)
。
< 用一些关于缩进差异的代码缩小了前缀部分;现在的问题就是程序定义的地方,参见编辑4 >
编辑4:好的我简化了这个问题。
- 在MIT-方案,
(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)中定义时。不管缩进。
以下是截图:
你有一个屏幕截图? – soegaard
尚无法复制。请注意,如果您在交互中输入定义,则可能会与Racket语言中定义的现有'last-pair'定义发生混乱:http://docs.racket-lang.org/reference/pairs .html?#%28def ._%28%28lib._racket%2Flist..rkt%29._last-pair%29%29将所有定义保留在“定义”窗格中并将“交互”窗格视为一个探索这些定义的地方。 – dyoo
另请注意,Racket中的注释符号使用分号而不是散列。你真正的程序是否有哈希? – dyoo