我在代码(map #(% a) fns)
中经常遇到这种模式,其中a是变量,表示字符串,fns是fq之类的[count #(split ",")]
。是否有更简洁的方式来表达这种模式?
答案 0 :(得分:3)
更简洁?可能不是。更好的成语?要看。 juxt
将获取任意数量的fns作为参数,并提供一个与其并置的函数。因此,您可以使用它来代替map
这样的
(def a "foo,bar,baz")
(map #(% a) [count #(split % #",")])
;=> (11 ["foo" "bar" "baz"])
((juxt count #(split % #",")) a)
;=> [11 ["foo" "bar" "baz"]]
一方面,你有一个懒惰的应用程序序列,另一方面你有功能组合。哪个更好取决于需要。
答案 1 :(得分:1)
表达它的直接方式:(for [f fns] (f a))
仅为了完整性而添加,它与基于map
的表达式一样好,除非您比匿名函数更喜欢for
。
答案 2 :(得分:0)
模式已经很简洁了。但是如果你想创建一个代表function collection
并且也可以调用的抽象,你可以试试这样的东西:
(defmacro function-coll [param-count]
(let [params (repeatedly param-count gensym)
name (symbol (str "Functions-" param-count))]
`(deftype ~name [fns#]
clojure.lang.IFn
(invoke [_ ~@params] (map #(% ~@params) fns#)))))
(function-coll 1)
(def one-fns (->Functions-1 [inc dec]))
(one-fns 10)
(function-coll 2)
(def two-fns (->Functions-2 [str vector]))
(two-fns :hello :world)
答案 3 :(得分:0)
我认为鹅口疮操作员在这里需要。
user=> (-> "a b c d"
.toUpperCase
(.replace "A" "X")
(.split " ")
first)
"X"