2

loopCommon Lisp 中的工具允许使用多个值累积子句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具有数值并不重要,它仅用于说明目的。

4

1 回答 1

8

混合绑定?

不,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
  ...)

请注意,变量maxminsummultiple-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

一般来说,这里给猫剥皮的方法不止一种……

于 2017-12-26T18:38:38.503 回答