Common Lisp`loop`:最大化为`let`引入的局部变量

Aro*_*oob 2 loops common-lisp local-variables let-binding

loopCommon Lisp中的工具允许使用多个价值累积条款maximize.
现在,它也可以提供可变varmaximize条款:

(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具有数值并不重要,仅用于说明目的.

sds*_*sds 7

混合绑定?

不,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-bindloop完全分开的,独立的,并有共同的绝对没有和被命名为唯一教学目的是相同的.

如果你重命名它们(因为你肯定应该为了代码可读性!):

(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)

一般来说,这里有不止一种方法给猫皮肤......