Чем отличается каждая вещь от минусов LISP?

Это выходы разных комбинаций аргументов в пользу минусов. Я только начал изучать язык. Может кто-нибудь помочь мне понять это?

Break 80 [81]> (CONS '(A) 'B) 
((A) . B)
Break 80 [81]> (CONS '(A) '(B)) 
((A) B)
Break 80 [81]> (CONS 'A 'B) 
(A . B)
Break 80 [81]> (CONS 'A '(B)) 
(A B)
Break 80 [81]> 

1 ответ

Функция cons всегда делает одно и то же: она создает cons-ячейку своих аргументов. Минус ячейка - это просто пара. Вы можете получить первый элемент пары с автомобилем, а второй элемент с помощью cdr.

Для написания буквенной ячейки вы можете заключить в кавычки и использовать обозначение (x . Y), где x - это автомобиль, а y - это cdr. Используя эту нотацию, вы можете написать свои примеры следующим образом (но не просто поверьте мне на слово, попробуйте в REPL):

> '((A) .  B ) ;=> ((A) . B)
> '((A) . (B)) ;=> ((A) B)
> '( A  .  B ) ;=> (A . B)
> '( A  . (B)) ;=> (A B)

Но почему результаты второго и четвертого случаев не распечатываются так, как мы их написали? Существуют специальные соглашения о печати для cons-ячеек, потому что мы используем cons-ячейки для реализации связанных списков.

Прочитайте 14.1.2 Conses as Lists для деталей, но список - это cons-ячейка, машина которой является первым элементом списка, а cdr - остальная часть списка (т. Е. Другой список). Это означает, что список (1 2 3) такой же, как (с использованием буквально-точечной нотации) (1. (2. (3. Nil))). Вы можете попробовать это в REPL:

> '(1 . (2 . (3 . nil))) ;=> (1 2 3)

Это очень полезное соглашение о печати (и вводе) для языка, где списки так важны. Я написал об этом больше в ответе на другие вопросы:

Другие вопросы по тегам