Схема: Когда я соединяю два атома, я получаю точку посередине. Почему?

Когда я делаю cons на двух атомах, я получаю . между ними.

1]=>(cons 'one 'two)
;Value 1: (one . two)

Почему я получаю оператор .. Имеет ли это какое-то значение? Я использую mit-scheme.

Я видел эту ссылку на stackoverflow, но не понял.

ОБНОВЛЕНИЕ: определение cons в Маленьком интригане гласит, что cons принимает два аргумента, первый из которых представляет собой любое S-выражение, а второй — любой список.


person Sreekumar R    schedule 10.07.2020    source источник
comment
dot — это обычный синтаксис парных литералов в Scheme. Точка просто опускается, если cdr пары представляет собой список.   -  person ceving    schedule 10.07.2020
comment
Маленькие книги немного сбивают с толку новичков. я думаю, они рассчитаны на тех, кто уже знает основы языка.   -  person Will Ness    schedule 11.07.2020
comment
Эта заповедь истинна только в пределах этой книги. Как сказано в сноске на стр. 8, на практике (cons α β) работает для всех значений α и β.   -  person molbdnilo    schedule 15.07.2020


Ответы (3)


Точка — это просто способ, которым Scheme отображает ячейку cons, когда часть cdr не сама по себе является ячейкой cons или пустым списком. Точка в данном случае не является оператором, например:

(cons 1 2)
=> '(1 . 2) ; a cons pair, a.k.a. a cons cell

(cons 1 (cons 2 3))
=> '(1 2 . 3) ; not a proper list, it doesn't end in '()

Если часть cdr является ячейкой cons или пустым списком '(), то у нас есть список:

(cons 1 '())
=> '(1) ; a proper list, ends in '()

(cons 1 (cons 2 '()))
=> '(1 2) ; a proper list, ends in '()

Определение в «Маленьком интригане» является упрощением, на самом деле cons может принимать значения любого типа для каждого из своих аргументов. По соглашению, если вторым аргументом является список, он будет считаться списком и отображаться как таковой, в противном случае это будет обычная старая ячейка cons, и точка будет напоминать вам об этом.

person Óscar López    schedule 10.07.2020
comment
Я новичок в ячейке минусов и неправильном списке. Не могли бы вы уточнить? - person Sreekumar R; 10.07.2020
comment
Конечно! ячейка cons — это объект, который возвращается, когда вы вызываете cons, думайте о нем как о контейнере с двумя позициями. Неправильный список — это список, который не заканчивается пустым списком, я привел пример в своем ответе: (cons 1 (cons 2 3)). - person Óscar López; 10.07.2020
comment
В Др. Рэкет (cdr (cdr (cons 1 (cons 2 3)))) выдает 3, а (cdr (cdr (cdr (cons 1 (cons 2 3))))) выдает ошибку о нарушении контракта. Ожидается пара? но получаю 3. Я в полном замешательстве. - person Sreekumar R; 10.07.2020
comment
Конечно, поскольку 3 не минус-ячейка, вы не можете идти дальше, вы достигли конца структуры. Я рекомендую вам больше узнать о cons и списках в замечательной книге «Структура и интерпретация компьютерных языков». Поиграйте с cons, car и cdr, пока не освоитесь. - person Óscar López; 10.07.2020
comment
Спасибо!. Я читаю это. На самом деле, я читаю 3 книги одновременно. Это может быть причиной. - person Sreekumar R; 10.07.2020

Процедура cons создает ячейку cons, указывающую на два предоставленных аргумента.

Cons-ячейка — это пара указателей, а список — это одна cons-ячейка или ряд cons-ячеек, второй указатель которых указывает на другую cons-ячейку, а второй указатель последней ячейки указывает на другой объект.

Примечание. Я использую слово объект для простоты, а не в смысле программирования.

В правильном списке второй указатель последней ячейки cons указывает на пустой список.

В неправильном списке второй указатель последней cons-ячейки указывает на объект, который не является пустым списком.

Примечание2: пустой список () является уникальным значением в схеме и отличается от списка. В common lisp он эквивалентен nil, Nil не существует в схеме.

+-----+-----+
|     |     |
|     |     |
+--+--+--+--+
   |     |
   |     |
   v     v
  obj   obj

Минус-ячейка

+-----+-----+     +-----+-----+     +-----+-----+
|     |     +---->+     |     +---->+     |     |
|     |     |     |     |     |     |     |     |
+--+--+-----+     +--+--+-----+     +--+--+--+--+
   |                 |                 |     |
   |                 |                 |     |
   v                 v                 v     v
   0                 1                 2     3

(0 1 2 . 3) -> (0 . (1 . (2 . 3)))    

Неверный список

+-----+-----+     +-----+-----+     +-----+-----+
|     |     +---->+     |     +---->+     |     +----> ()/nil
|     |     |     |     |     |     |     |     |
+--+--+-----+     +--+--+-----+     +--+--+-----+
   |                 |                 |
   |                 |                 |
   v                 v                 v
   0                 1                 2


(0 1 2) -> (0 . (1 . (2 . () )    

Правильный список

Точка (когда она видна в repl) используется для обозначения того, что последний указатель списка указывает на объект, который не является пустым списком и, следовательно, является неправильным списком.

Это мое понимание, по крайней мере, из общего lisp, хотя я уверен, что это переводится в большинство других lisp (я думаю, что Clojure отличается (если вы считаете его lisp)).

страница Википедии о минусах.

~

person Kyuvi    schedule 13.07.2020

Маленький Интриган лжет. cons может принимать любой тип в качестве первого и второго аргумента. Вы всегда можете создать пару со структурами в кавычках, такими как '(1 . 8).

Специальной структуры данных для составления списков нет, поэтому в Scheme есть хитрость. Они определяют список либо как пустой список, либо как cons, у которого есть список как его cdr. Таким образом, '(1 . (2 . (3 . ()))) — это список, и если вы его оцените, Scheme repl напечатает (1 2 3) обратно. Если вы оцените '(1 2 3), читатель превратит входной код в '(1 . (2 . (3 . ()))) до того, как интерпретатор схемы сможет его оценить. Список, оканчивающийся на '(), называется правильным списком, так как в нем нет точек между двумя последними элементами. например. '(1 . (2 . (3 . 4))) ; ==> (1 2 3 . 4)

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

person Sylwester    schedule 14.07.2020