Чем отличается каждая вещь от минусов 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)
Это очень полезное соглашение о печати (и вводе) для языка, где списки так важны. Я написал об этом больше в ответе на другие вопросы: