Как это сделать ((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),

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