Common Lisp中的loop
工具允许多个价值累积条款,maximize
等。
现在,也可以为var
子句提供变量maximize
:
(loop for x from 0 to 10 maximize (func x) into var)
我的问题是:
是否可以将var
引入的新本地变量作为let
?
示例场景是:
(let ((var -1)) ; assume numeric result
(loop for x from 0 to 10 maximize (func x) into var))
x
具有数值并不重要,仅用于说明目的。
答案 0 :(得分:7)
不,into
变量受loop
约束。
您可以做的是将var
绑定到loop
的返回值:
(let ((var (loop for x from 0 to 10 maximize (func x))))
;; use var here
...)
如果你在一个循环中做很多事情,你可能想要使用values function in 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
...)
请注意,由multiple-value-bind
和loop
约束的变量max
,min
和sum
完全独立且独立,并且绝对没有任何内容共同的并且仅出于教学目的而命名相同。
如果你重命名它们(因为你的代码可读性肯定应该!):
(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
...)
并重新编译你的代码,你会看到 disassembly 相同。
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
一般来说,这里有不止一种方法给猫皮肤......