Aro*_*oob 2 loops common-lisp local-variables let-binding
loopCommon Lisp中的工具允许使用多个价值累积条款maximize.
现在,它也可以提供可变var的maximize条款:
(loop for x from 0 to 10 maximize (func x) into var)
Run Code Online (Sandbox Code Playgroud)
我的问题是:
是否有可能作为var一个新的局部变量引入let?
一个示例场景是:
(let ((var -1)) ; assume numeric result
(loop for x from 0 to 10 maximize (func x) into var))
Run Code Online (Sandbox Code Playgroud)
x具有数值并不重要,仅用于说明目的.
不,into变量受到约束loop.
你可以做的是绑定你var的返回值loop:
(let ((var (loop for x from 0 to 10 maximize (func x))))
;; use var here
...)
Run Code Online (Sandbox Code Playgroud)
如果你在一个循环中做很多事情,你可能想在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
...)
Run Code Online (Sandbox Code Playgroud)
需要注意的是变量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
...)
Run Code Online (Sandbox Code Playgroud)
并重新编译您的代码,您将看到 反汇编是相同的.
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
Run Code Online (Sandbox Code Playgroud)
一般来说,这里有不止一种方法给猫皮肤......