У меня проблемы с клетками cons, и у меня есть вопрос об элементах в программе lisp - PullRequest
0 голосов
/ 17 апреля 2020
((one) for all (and (two (for me))))

Сколько элементов в этом списке? В книге написано 4, но я просто не вижу этого. Это Common Lisp, кстати.

Ответы [ 2 ]

3 голосов
/ 18 апреля 2020

В списке ((one) for all (and (two (for me)))) есть четыре элемента: список (one), символ for, символ all и список (and (two (for me))).

Если у вас есть вопросы вот так можно поэкспериментировать в REPL:

CL-USER> (setf my-list '())
NIL
CL-USER> (length my-list)
0

Мы создали пустой список my-list и проверили его длину.

CL-USER> (setf my-sublist '(and (two (for me))))
(AND (TWO (FOR ME)))
CL-USER> (length my-sublist)
2

Мы создали еще один список, my-sublist. Обратите внимание, что этот список содержит символ and, а список (two (for me)). Результат, возвращаемый length, подтверждает, что my-sublist содержит два элемента (один символ и один список).

CL-USER> (setf my-list (cons my-sublist my-list))
((AND (TWO (FOR ME))))
CL-USER> (length my-list)
1

У нас есть cons ed my-sublist на my-list, чтобы создать список содержащий один элемент, который является списком (and (two (for me))). Обратите внимание, что список my-sublist, то есть список (and (two (for me))) содержит два элемента, но список my-list - на данный момент ((and (two (for me)))) - содержит только one элемент, а именно список my-sublist.

CL-USER> (setf my-list (cons 'all my-list))
(ALL (AND (TWO (FOR ME))))
CL-USER> (length my-list)
2
CL-USER> (setf my-list (cons 'for my-list))
(FOR ALL (AND (TWO (FOR ME))))
CL-USER> (length my-list)
3
CL-USER> (setf my-list (cons '(one) my-list))
((ONE) FOR ALL (AND (TWO (FOR ME))))
CL-USER> (length my-list)
4

Мы добавили оставшиеся три элемента (символы all и for и список (one). В результате получается список из четырех элементы, как и ожидалось.

2 голосов
/ 18 апреля 2020
CL-USER 14 > (do ((list '((one) for all (and (two (for me)))) (rest list))
                  (i 1 (1+ i)))
                 ((null list))
               (terpri)
               (princ "Element ")
               (princ i)
               (princ " is ")
               (princ (first list)))

Element 1 is (ONE)
Element 2 is FOR
Element 3 is ALL
Element 4 is (AND (TWO (FOR ME)))
NIL
...