Как это сделать ((AB).(CD)) в Лисп
Я пытаюсь выяснить, как сделать это, используя минусы:
((A . B) . (C . D))
где (A . B)
а также (C . D)
находятся в каждой клетке минусов
Я пытался сделать это (cons (cons 'a 'b) (cons 'c 'd))
но это дает мне это:
((A.B) C . D)
Я также попробовал это: (cons (cons 'a 'b) (cons (cons 'c 'd) ()))
но это дает мне это:
((A . B) (C . D))
Есть идеи как этого добиться?
4 ответа
Первый - это то, что вы хотите. Они эквивалентны. Вы можете проверить, как это:
1 ]=> (cons (cons 'a 'b) (cons 'c 'd))
;Value 11: ((a . b) c . d)
1 ]=> (car (cons (cons 'a 'b) (cons 'c 'd)))
;Value 12: (a . b)
1 ]=> (cdr (cons (cons 'a 'b) (cons 'c 'd)))
;Value 13: (c . d)
Помните, что список является минусом. "Car" - это головной элемент списка или первая половина cons-ячейки, а cdr - остальная часть списка или второй элемент cons-ячейки.
Еще один способ убедиться, что они эквивалентны:
1 ]=> '((a . b) . (c . d))
;Value 14: ((a . b) c . d)
Просто посмотрите на то, что вы получаете, когда вы вводите в буквальном ((A . B) . (C . D))
:
* '((a. b). (c. d)) ((A. B) C. D)
Существует определенный алгоритм, который принтер Lisp использует для распечатки структур данных, построенных из пар. По сути, вы никогда не сможете получить минусы, которые будут напечатаны в виде пунктирной пары в скобках, когда это CDR другого минуса.
Тем не менее, можно переконфигурировать принтер, чтобы получить требуемое поведение через SET-PPRINT-DISPATCH:
(set-pprint-dispatch 'cons (лямбда (объект потока) (формат потока "(~W . ~W)" (объект car) (объект cdr))))
* '((a. b). (c. d)) ((A . B) . (C . D)) * (минусы (минусы 'a' b) (минусы 'c 'd)); тот же объект ((A . B) . (C . D))
Хотя, несмотря на это, в долгосрочной перспективе было бы лучше, если бы вы научились читать поведение по умолчанию.
Я не совсем уверен, что вы имеете в виду... Я согласен с приведенным выше комментарием, что последняя строка вашего кода напоминает первую, с которой вы сопоставляете.
В любом случае, вот вам приличный общий ресурс: http://www-2.cs.cmu.edu/~dst/LispBook/
То, что вы ищете, невозможно из-за того, как списки представлены в Лиспе. Когда вы создаете список, вы создаете серию cons-ячеек, где car ячейки - это значение этого элемента в списке, а cdr - ссылка на следующую cons-ячейку. Ваша желаемая клетка, ((A . B) . (C . D))
означает "создать камеру минусов, где автомобиль (A . B)
и CDR (C . D)
Msgstr "Это эквивалентно списку, в котором первый элемент (A . B)
второй элемент C
и хвост списка D
, или же ((A . B) C . D)
,