Question: The code is below, the contents of the list myList
were copied in the debugger.
(let* ((myList '(("Concept Index"
("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi")
("ТочкаНоды" "@node Concept Index")
("спсСсылок"))
("Function Index"
("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi")
("ТочкаНоды" "@node Function Index")
("спсСсылок"))
("Variable Index"
("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi")
("ТочкаНоды" "@node Variable Index")
("спсСсылок"))
("Reserved Word Index"
("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi")
("ТочкаНоды" "@node Reserved Word Index")
("спсСсылок"))
("Builtin Index"
("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi")
("ТочкаНоды" "@node Builtin Index")
("спсСсылок"))
("Indexes"
("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi")
("ТочкаНоды" "@node Indexes")
("спсСсылок"))
("GNU Free Documentation License"
("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi")
("ТочкаНоды" "@node GNU Free Documentation License")
("спсСсылок"))
("Major Differences From The Bourne Shell"
("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi")
("ТочкаНоды" "@node Major Differences From The Bourne Shell")
("спсСсылок"))
("Reporting Bugs"
("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi")
("ТочкаНоды" "@node Reporting Bugs")
("спсСсылок"))
("Optional Features"
("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi")
("ТочкаНоды" "@node Optional Features")
("спсСсылок"))))
(текАссоц (assoc "спсСсылок" (assoc "Optional Features" myList)))
(текСписСсылок (cdr текАссоц)))
(setcdr текАссоц (add-to-list 'текСписСсылок "hudoSsulka"))
myList)
The code fulfills as expected: in the associative list with the association "Optional Features"
, in the associative list with the association
"спсСсылок"
the element
"hudoSsulka"
is added.
However, with the following code:
(let* ((myList спЯкрНд)
(текАссоц (assoc "спсСсылок" (assoc (match-string-no-properties 1) myList)))
(текСпсСсылок (cdr текАссоц)))
(setcdr текАссоц (add-to-list (quote текСпсСсылок) (match-string-no-properties 0)))
myList)
all indiscriminately the parent of the
"спсСсылок"
association is populated. Why does this happen? what happens with the list when changing one specific nested list
(("Function Index" ("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi") ("ТочкаНоды" "@node Function Index") ("спсСсылок" "@ref{Bash Features}")) ("Variable Index" ("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi") ("ТочкаНоды" "@node Variable Index") ("спсСсылок" "@ref{Bash Features}")) ("Reserved Word Index" ("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi") ("ТочкаНоды" "@node Reserved Word Index") ("спсСсылок" "@ref{Bash Features}")) ("Builtin Index" ("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi") ("ТочкаНоды" "@node Builtin Index") ("спсСсылок" "@ref{Bash Features}")) ("Indexes" ("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi") ("ТочкаНоды" "@node Indexes") ("спсСсылок" "@ref{Bash Features}")) ("GNU Free Documentation License" ("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi") ("ТочкаНоды" "@node GNU Free Documentation License") ("спсСсылок" "@ref{Bash Features}")) ("Major Differences From The Bourne Shell" ("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi") ("ТочкаНоды" "@node Major Differences From The Bourne Shell") ("спсСсылок" "@ref{Bash Features}")) ("Reporting Bugs" ("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi") ("ТочкаНоды" "@node Reporting Bugs") ("спсСсылок" "@ref{Bash Features}")) ("Optional Features" ("Файл" "/home/alamd/example/funEl/expirement/perevod_bash6/bash.texi") ("ТочкаНоды" "@node Optional Features") ("спсСсылок" "@ref{Bash Features}")))
Please look at the overall code:
;;;ПлчСпсЯкр функция возвращает список якорей файлов
(defun ПлчСпсЯкр (списокФайлов)
;;;спсЯкр переменная для списка якорей файлов в спФйл
(let (
(списокЯкорей (list));;;ассоциативный список нод и якорей
(списокОглавления (list))
(спсОбщий (list))
ткБфр)
(progn
;;;Перебираем список с путями к файлам
(dolist (текИмяФайла списокФайлов списокЯкорей)
;;;Создаем буфер и сохраняем его имя
(setq ткБфр (find-file-noselect текИмяФайла))
;;;Переключаемся в созданный буфер
(switch-to-buffer ткБфр)
;;;Чешем в начало буфера
(goto-char (point-min))
;;;Ищем якоря и добавляем их в список
(while (and (< (point) (point-max))
(re-search-forward
;;;Ищем ноду или якорь, добавляем в список
"^\\(?2:@node[[:space:]]+\\(?1:.+\\),?.*\\)\\|\\(?2:@anchor{\\(?1:[^}]+\\)}+?\\)" (point-max) t)
(let ((line (match-string-no-properties 2)) (soderjanie (match-string-no-properties 1)))
(add-to-list 'списокЯкорей `(,soderjanie ("Файл" ,текИмяФайла) ("ТочкаНоды" ,line) ("спсСсылок")))))
)
;;;Ищем команды структурирования
(goto-char (point-min))
(while (and (< (point) (point-max))
(re-search-forward
;;;Ищем ноду или якорь, добавляем в список
"\\(@\\(?:appendix\\(?:s\\(?:ec\\(?:tion\\)?\\|ubs\\(?:\\(?:ubs\\)?ec\\)\\)\\)?\\|chap\\(?:heading\\|ter\\)\\|heading\\|majorheading\\|s\\(?:ection\\|ub\\(?:heading\\|s\\(?:ection\\|ub\\(?:heading\\|section\\)\\)\\)\\)\\|top\\|unnumbered\\(?:s\\(?:\\(?:ubs\\(?:ubs\\)?\\)?ec\\)\\)?\\)\\)\\>.+" (point-max) t)
(add-to-list 'списокОглавления (match-string-no-properties 0)))
)
;;;Удаляем обработанный буфер
(kill-buffer ткБфр)
)
(add-to-list 'спсОбщий (cons "Якоря" списокЯкорей))
(add-to-list 'спсОбщий (cons "Содержание" списокОглавления))
спсОбщий)
)
)
Part of the code when creating the list
(let ((line (match-string-no-properties 2)) (soderjanie (match-string-no-properties 1)))
(add-to-list 'списокЯкорей `(,soderjanie ("Файл" ,текИмяФайла) ("ТочкаНоды" ,line) ("спсСсылок"))))
or should I rewrite the list overflow code?
setcdr
directly on a quoted list, i.e. one created as'(...)
. Instead, either create the list withlist
, or first make a copy of it withcopy-sequence
or similar.add-list
forlet
-bound variables. Usecl-pushnew
instead. (Mind the order of arguments!) 2. Construct the list withlist
instead of the backquote.