2009-06-04 3 views
1

Когда я делаю список в Scheme, на что указывает cdr последней пары? Это «пустое слово» или «пустой список»? DrScheme не имеет значения (cons 'a empty) или (cons 'a '()). Наконец, в чем разница между пустым словом и пустым списком?Что последний элемент в списке указывает на Схему?

ответ

4

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 
1

cdr последней пары указывает на '(), пустой список.

+0

Почему (минус «пустая» работа)? – unj2

+1

Все списки состоят из серии списков, каждая из которых имеет длину 2. Например, (1 2 3) на самом деле является списком длины 2: первый элемент равен 1, а второй элемент - (2 3). Этот внутренний список также является списком длины 2: первый элемент равен 2, а второй элемент - (3). Этот второй элемент также представляет собой список из двух элементов: первый элемент - 3, а второй элемент -(). Итак, cons ('a'()) возвращает ('a), потому что это фактически (' a. '()). –

1

Ответ на все ваши вопросы можно найти, если вы оцениваете символ empty. Он определен как равный '(), пустой список, и это то, на что указывает последний cdr. Для того, чтобы убедить себя, попробуйте следующее:

(cdr (list 1 2 3)) 
(cdr (cdr (list 1 2 3))) 
(cdr (cdr (cdr (list 1 2 3)))) 
+0

Хотя он отвечает на часть моего вопроса, я просто понял, что cdr не должен указывать на пустой. У меня может быть неправильный список, например (a .d). Спасибо, в любом случае. – unj2