Перепутать крепления?
Нет, переменные into
связаны loop
.
Что вы можете сделать, так это привязать свой var
к возвращаемому значению loop
:
(let ((var (loop for x from 0 to 10 maximize (func x))))
;; use var here
...)
Сложный цикл — использование нескольких значений, функциональный стиль
Если вы делаете много вещей в одном цикле, вы можете использовать функцию values в Common Lisp:
(multiple-value-bind (max min sum)
(loop for x from 0 to 10
maximize (f1 x) into max
minimize (f2 x) into min
sum (f3 x) into sum
finally (return (values max min sum)))
;; use max, min and sum here
...)
Обратите внимание, что переменные max
, min
и sum
связаны multiple-value-bind
и loop
являются совершенно отдельными и независимыми, не имеют абсолютно ничего общего и называются то же самое только в дидактических целях.
Если вы переименуете их (что обязательно нужно сделать для удобочитаемости кода!):
(multiple-value-bind (max min sum)
(loop for x from 0 to 10
maximize (f1 x) into max1
minimize (f2 x) into min1
sum (f3 x) into sum1
finally (return (values max1 min1 sum1)))
;; use max, min and sum here
...)
и перекомпилируйте свой код, вы увидите, что разборка идентична эм>.
Сложный цикл, используйте finally
, процедурный стиль
Как предложил @coredump, вы можете установить свои переменные в конструкции finally
:
;; bind max, min and sum
(loop for x from 0 to 10
maximize (f1 x) into max1
minimize (f2 x) into min1
sum (f3 x) into sum1
finally (setq max max1
min min1
sum sum1))
;; use max, min, and sum; max1 et al do not exist here
Вообще говоря, здесь есть не один способ содрать шкуру с кота...
person
sds
schedule
26.12.2017
loop
, а не хвостовые вызовы :). - person Aroob   schedule 29.12.2017