【发布时间】:2013-01-25 23:00:58
【问题描述】:
我需要实现这样的东西:
(loop for i from 1 to N sum (f i))
除了累积值表示数字列表,如 (1 2 3) 并且它们是按元素添加的。换句话说,我想初始化求和 使用 (zerov N) 并使用 (v+) 添加后续元素:
(defun v+ (a b) (mapcar '+ a b))
(defun zerov (n) (loop for i from 1 to n collect 0))
可以用循环宏做这样的事情吗?我可以将它实现为 单独的函数,但我想使用循环或类似循环的宏来表达。 也许有一种方法可以为这种情况定义简单的类似循环的宏?
【问题讨论】:
-
标准 LOOP 没有为用户提供任何自定义操作的方法,但可能有特定于实现的扩展允许这样做(早期的 MacLisp LOOP 允许用户定义的运算符,并且某些实现可能有建立在该代码之上)。
-
我正在使用 CCL。我没有看到任何我可以使用的东西。
-
(mapcar+ a b)` 可以立即识别。但是,它将向量的表示提交给列表。最好的办法是抽象矢量 API 背后的矢量操作。在您自己的包中,您可以将+运算符绑定到可以添加两个向量的函数(并且仍然适用于数字,可能还有数字和向量的组合)。
标签: loops lisp common-lisp