此代码不起作用:
(((fn [& fns]
(fn [& params]
(reduce #(%2 %1) params fns)))
rest reverse)
[1 2 3 4]) ;; => () instead of (3 2 1)
有没有办法通过#(%2 %1)
内的更改来修复它?
我认为这个问题等同于:如何将(#<core$rest>)
转换为(rest)
?
注意:这是我要解决的问题http://www.4clojure.com/problem/58我已经看到了其他解决方案,但我对此具体实施感到好奇。
答案 0 :(得分:4)
尝试使用[params]
而不是[& params]
,所以:
(fn [params] (reduce #(%2 %1) params fns))
[& params]
参数收集了一个集合[1 2 3 4]
,并在list
中再次将其包装,并将([1 2 3 4])
作为reduce
函数的种子。
如果您只想在#(%2 %1)
内进行更改,则需要解开([1 2 3 4])
,但这只是第一次。您可以看到first
是否返回了一个集合,因此(coll? (first %1))
,然后调用(first %1)
,否则只需保留%1
。看起来很复杂,但不适用于其他输入数据。