【发布时间】:2016-09-06 15:15:53
【问题描述】:
我正在尝试编写我的第二个宏,但我完全被困在这里。
我想避免每次都写(vec (for [...])),所以我尝试写一个forv 宏,比如filterv、mapv 等。
我在我的程序中主要使用向量,因为我需要访问索引,因为我使用外部缓冲区/描述符来固定矩阵过程。
我写了很多类似 ***v 的函数(还有像 fmap 这样的自适应函数),但我坚持使用。
所以我写了
(defmacro forv
[seq-exprs body-expr]
(vec (for (vec seq-exprs) body-expr)))
我尝试单独使用 seq-exprs,但它不起作用。老实说,我也尝试过~等等,但我不知道它是如何工作的,我在我的第一个宏中成功了,因为它要容易得多。
Clojure 告诉我 for 需要一个用于绑定的向量。
有人可以帮助我并解释我缺少什么吗?谢谢!
【问题讨论】:
-
您能否详细说明一下为什么需要将
for返回值显式转换为向量? -
我添加了解释。一般是我经常需要访问索引或通过索引来访问算法。
-
@nha's answer 传递了@AlanThompson's 检测到的一些病态调用。例如,给定
(forv '() 888),前者返回[],而后者检测到错误。