【发布时间】:2020-08-11 12:06:39
【问题描述】:
有没有办法使用单个列表组合来实现以下目标,还是我需要其他方法?
(def args '([[:db/foo 1 2] [:db/bar 3 4]] {:a 1 :b 2}))
(defn myfunc []
"Want to run inner loop only once if arg is a map."
(for [arg args [cmd & params] arg] ; 'cmd & params' are meaningless if map.
(if (map? arg)
arg
(into [cmd] params))))
以上代码产生
=> [[:db/foo 1 2] [:db/bar 3 4] {:a 1, :b 2} {:a 1, :b 2}]
但我真的想要
=> [[:db/foo 1 2] [:db/bar 3 4] {:a 1, :b 2}]
显然这不是完整的功能,如果 arg 是矢量形式但我想让 map 形式直接通过(不被复制),我正在做转换。
更新:我发现list comprehension 的根源在于set builder notation,而“有条件地执行内部循环”实际上是一个命令式概念,所以这并不奇怪。用单个列表理解来表达并不容易,这完全是一个 fp 构造。
【问题讨论】:
标签: clojure