Я работаю через 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 и ракетка Scheme.
EDIT 1: MIT-Scheme не подходит для этого. last-pair
возвращение товара 5
не '(5)
. Что правильно?!?
EDIT 2: Интересно, что в DrRacket (не в MIT-схеме), если вторая линия (cond ((null? (cdr alist))
отступом два пространства, когда процедура вызывается, она возвращает '(5)
. Но, когда вторая строка не имеет отступов, она возвращает 5
. Это глюк? Я считаю, что все, что интерпретаторы Схемы должны следовать, это скобки, правильно?
EDIT 3: Я начинаю думать, что это сбой в DrRacket. Когда я помещаю определение процедуры в окно определения (обычно это верхняя панель редактора), независимо от отступа, процедура вернет 5
. Но если я определяю его в окне интерфейса , , то отступ влияет на результат, как описано в Edit 2. (EDIT 4), независимо от отступов, он вернет '(5)
.
< отрезан от превентивной части с некоторым кодом о различиях в отступлении; теперь проблема заключается именно в том, где процедура определена, см. Редактирование 4 >
EDIT 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
Невозможно воспроизвести. Обратите внимание: если вы вводите определения во взаимодействиях, вы можете столкнуться с беспорядочным столкновением с существующим определением 'last-pair', определенным на языке Racket: http://docs.racket-lang.org/reference/pairs .html? #% 28def ._% 28% 28lib._racket% 2Flist..rkt% 29._last-pair% 29% 29 Гораздо безопаснее хранить все свои определения в панели «Определения» и просто обрабатывать панель «Взаимодействие» как место для изучения этих определений. – dyoo
Также обратите внимание, что примечание комментария в Racket использует точки с запятой, а не хеши. У вашей реальной программы есть хеши? – dyoo