我遇到过这种情况:
(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吗?
答案 0 :(得分:4)
也许loop
绑定中的解构会有所帮助吗?
(loop [ [arg0 arg1] [false false] arg2 false] ...
允许您(recur (produce) arg2)
在循环体中,produce
返回的2元素序列被解构并绑定到arg0
和arg1
。
答案 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))