混合绑定?
不,into
变量受loop
.
您可以做的是将您var
的返回值绑定到loop
:
(let ((var (loop for x from 0 to 10 maximize (func x))))
;; use var here
...)
复杂循环 - 使用多个值,函数式风格
如果你在一个循环中做很多事情,你可能想在 Common Lisp 中使用 values 函数:
(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
...)
并重新编译你的代码,你会看到
反汇编是一样的。
正如@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
一般来说,这里给猫剥皮的方法不止一种……