в чем разница двух списков в схеме - PullRequest
2 голосов
/ 31 марта 2011

Я новичок в схеме. Я просто запутался в разнице следующих двух списков.

(define a '(1 2))
(define a '(1 . 2))

Я думаю, что равно b, но

(equal? a b)

верни мне #f. Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

4 голосов
/ 31 марта 2011

Два не одинаковы. Первый - это обычный список. В точечных обозначениях это будет выглядеть так:

(1 . (2 . nil))

Обычный список хранит данные в car ячейки cons, а cdr используется только для хранения указателя на следующую ячейку cons в списке или Nil для последней ячейки в список.

Ваше определение a использует только одну ячейку cons, с 1 в car и 2 в cdr.

Если бы вы нарисовали их графически, они бы выглядели так:

enter image description here

1 голос
/ 31 марта 2011

Точечная запись используется в Scheme и LISP для описания «неправильных списков», тех, которые не соответствуют стандартному определению данных списков.Этот вопрос:

Функциональное программирование: что такое «неправильный список»?

... вероятно, отвечает на большинство ваших вопросов.Дайте мне знать, если есть что-то, что этот пост не отвечает.

Удачи!

0 голосов
/ 05 апреля 2011

Они не возвращают равные, потому что они не имеют одинаковый тип данных.первый с: (define a '(1 . 2)) - это то, что называется парой.Список - это пара, но не все пары являются списками.Списки - это пары, которые имеют car, а их cdr - список.Когда вы получаете точечную запись, это означает, что car этой пары равно 1, а cdr равно 2. Поскольку они не имеют одинаковый тип данных, они не могут быть равны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...