Давайте немного переделаем вашу функцию.
Во-первых, с лучшим отступом :
(defun chooseBest (TSPs dTSPs)
(let ((minim (minPos dTSPs 0 0))
(j 0)
(best nil))
(loop for i in TSPs
do (cond ((= j minim)
(progn (setf best i)
(setq j (+ j 1))))
(t
(setq j (+ j 1)))))
best))
Нет необходимости в progn
внутри cond
:
do (cond ((= j minim)
(setf best i)
(setq j (+ j 1)))
(t
(setq j (+ j 1)))))
Увеличение j можно выполнить с помощью incf
:
(setq j (+ j 1)))
=>
(incf j)
Вы можете переместить переменные let в л oop.
(let ((minim (minPos dTSPs 0 0))
(j 0)
(best nil))
(loop for i in TSPs
=>
(loop for it in TSPs
for j from 0
with minim = (minPos dTSPs 0 0)
with best
do …)
for j from 0
запускает счетчик, with … =
объявляет переменную, которая вычисляется в начале (а не на каждой итерации).
Возвраты и условия
Внутри al oop мы можем использовать if…do
, else…do
, when
и return
и более одного раза. Чтобы сделать что-то в конце l oop, используйте finally
.
(defun chooseBest (TSPs dTSPs)
(loop for i in TSPs
for j from 0
with minim = (minPos dTSPs 0 0)
with best
if (= j minim)
do (progn (setf best i)
(incf j))
else
do (incf j)
finally (return best)))
Функции для поиска списков и последовательностей
Теперь, если Вы хотите найти элемент в списке, для этого у вас есть множество функций: поиск, nth, поиск, позиция,… см. https://lispcookbook.github.io/cl-cookbook/data-structures.html#functions Поскольку minPos
возвращает индекс, вы, вероятно, захотите nth index list
или elt sequence index
.