Когда я делаю список в Scheme, на что указывает cdr последней пары? Это «пустое слово» или «пустой список»? DrScheme не имеет значения (cons 'a empty)
или (cons 'a '())
. Наконец, в чем разница между пустым словом и пустым списком?Что последний элемент в списке указывает на Схему?
ответ
DrScheme не возражает против вашего cons
-ing, потому что cons
может сделать больше, чем просто построить списки. Из ссылки,
(cons a d) → pair? a : any/c d : any/c
, что означает, что cons
строит пары. Это также совершенно законно делать
> (cons 1 2)
(1 . 2)
который не является списком, но все еще позволяет делать
> (car (cons 1 2))
1
> (cdr (cons 1 2))
2
Но в любом случае, «пустое слово» и «пустой список» одни и те же объект , что может быть проверено
> (eq? empty '())
#t
cdr последней пары указывает на '(), пустой список.
Ответ на все ваши вопросы можно найти, если вы оцениваете символ empty
. Он определен как равный '()
, пустой список, и это то, на что указывает последний cdr. Для того, чтобы убедить себя, попробуйте следующее:
(cdr (list 1 2 3))
(cdr (cdr (list 1 2 3)))
(cdr (cdr (cdr (list 1 2 3))))
Хотя он отвечает на часть моего вопроса, я просто понял, что cdr не должен указывать на пустой. У меня может быть неправильный список, например (a .d). Спасибо, в любом случае. – unj2
Почему (минус «пустая» работа)? – unj2
Все списки состоят из серии списков, каждая из которых имеет длину 2. Например, (1 2 3) на самом деле является списком длины 2: первый элемент равен 1, а второй элемент - (2 3). Этот внутренний список также является списком длины 2: первый элемент равен 2, а второй элемент - (3). Этот второй элемент также представляет собой список из двух элементов: первый элемент - 3, а второй элемент -(). Итак, cons ('a'()) возвращает ('a), потому что это фактически (' a. '()). –