使用seq / coll的元素作为call / recur参数

时间:2012-02-15 08:06:11

标签: clojure

我遇到过这种情况:

(fn produce [] '(val0 val1))

;...

(loop [
    arg0 false
    arg1 false
    arg2 false] 

    ;...

)

是否有某种解包功能/宏可以调用

(recur (unpack (produce)) :arg2)

在循环上下文中?我知道我可以做一些像

这样的事情
(recur (nth (produce) 0) (nth (produce) 1) :arg2)

但是前一种解决方案肯定会更优雅吗?

IIRC Common Lisp代码可以返回多个值,也可以Clojure吗?

2 个答案:

答案 0 :(得分:4)

也许loop绑定中的解构会有所帮助吗?

(loop [ [arg0 arg1] [false false] arg2 false] ...

允许您(recur (produce) arg2)在循环体中,produce返回的2元素序列被解构并绑定到arg0arg1

答案 1 :(得分:1)

一般来说,解构很有效,会做你想做的事。做一些像

这样的问题
(loop [[arg0 arg1] (get-my-arg-list)] ...

当您致电recur时,您必须将所有内容重新捆绑到列表中。因此,递归调用看起来像

(recur [new-arg0 new-arg1])

如果这是一个交易破坏者,您还可以定义一个匿名函数与recur一起使用,然后在第一次调用它时使用apply解压缩参数列表,尽管这种技术是整体而言相当难看。例如:

(apply (fn [arg0 arg1]
         ...
         (recur new-arg0 new-arg1))
       (get-my-arg-list))