Очевидный способ решения проблемы - просто посмотреть на каждый элемент списка по очереди, и каждый раз, когда сравнивается равный стрелке, собирать свое положение в выходной список.Получить позицию очень легко в этом случае, потому что мы начинаем с начала haystack; , мы можем использовать переменную для подсчета текущей позиции, начиная с 0.
Так что если мы опишемполный алгоритм в предложении, мы бы сказали что-то вроде «найти все позиции иглы в стоге сена, для каждого элемента в стоге сена, и положение, начинающееся с 0, когда элемент равен игле, собратьпозиция. "
Средство LOOP - это, по сути, правильная вещь, которую нужно использовать, когда вы хотите выполнить итеративную обработку.Хотя его синтаксис сложен для формального описания, после некоторого опыта вы можете просто поместить описание алгоритма на английском языке в тело LOOP, и оно будет работать.
(defun all-positions (needle haystack)
(loop
for element in haystack
and position from 0
when (eql element needle)
collect position))