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

时间:2017-12-26 18:24:00

标签: loops common-lisp local-variables let-binding

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

1 个答案:

答案 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-bindloop约束的变量maxminsum 完全独立且独立,并且绝对没有任何内容共同的并且仅出于教学目的而命名相同。

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

(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

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