Что означает термин «элемент» в (dolist (список элементов) ...)? - PullRequest
4 голосов
/ 12 ноября 2011

Я работал над учебником по общему lisp, и я только что познакомился с incf и dolist, я хотел посмотреть, правильно ли я понял, как работает dolist, сделав функцию inc-list, котораяувеличил бы каждый элемент списка на единицу:

(defvar a-list (list 1 2 3))

(inc-list a-list) => (2 3 4)

Вот как я определил inc-list

(defun inc-list (list)
  (progn 
    (dolist (element list)
      (incf element))
    list))

Это не похоже на работу.когда я пытаюсь (inc-list a-list), я возвращаюсь (1 2 3) и a-list => (1 2 3).Это не беспокоило бы меня так сильно, если бы не факт:

(incf (car a-list))
(incf (cadr a-list))
(incf (caddr a-list))

дает мне a-list => (2 3 4).Есть ли секрет, что означает element?

Ответы [ 2 ]

4 голосов
/ 12 ноября 2011

element привязывается к каждому из элементов списка, в свою очередь, то есть значение car каждой пары в некотором смысле «копируется» в него. Затем incf вызывается для element, увеличивая значение этой переменной , но не позицию списка, из которой она была взята из . Это как если бы вы делали

(defvar element (car a-list))
(incf element)
(setq element (cadr a-list))
(incf element)
(setq element (caddr a-list))
(incf element)

Здесь также element увеличивается, а затем немедленно "забывается" каждый раз, потому что setq 'd принимает новое значение. Напротив, (incf (car a-list)) увеличивает car из a-list на месте . Если вам нужно такое поведение в цикле, тогда забудьте о dolist и loop on списке:

(loop for position on lst
      do (incf (car position)))
2 голосов
/ 12 ноября 2011
(defvar a-list (list 1 2 3))

Примечание : Не пишите глобальные переменные, подобные этой.Напишите *a-list*.В противном случае глобальная динамическая переменная влияет на ваши локальные переменные.

(defun inc-list (list)
  (progn 
    (dolist (element list)
      (incf element))
    list))

Вам не нужно PROGN.DEFUN уже допускает последовательность форм, как и DOLIST.

(defun inc-list (list)
  (dolist (element list)
    (incf element))
  list)

Выше достаточно.

DOLIST - это форма, которая вводит новую (!) Локальную переменнуюselected ELEMENT.

DOLIST устанавливает значение ELEMENT в каждой итерации.Все, что вы делаете, это увеличиваете значение ELEMENT на каждом шаге итерации.Ваш побочный эффект потерян.Исходный список не изменяется.В противном случае значение ELEMENT не используется.

...