3

我在我的代码中经常遇到这种模式,(map #(% a) fns)其中 a 是一个变量,比如一个字符串,而 fns 是一个 fns 的序列,例如[count #(split ",")]. 有没有更简洁的方式来表达这种模式?

4

4 回答 4

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"]]

一方面,你有一个惰性的应用程序序列,另一方面你有功能组合。哪个更好取决于需要。

于 2013-03-07T12:08:50.837 回答
1

一种直接的表达方式:(for [f fns] (f a))

仅为了完整性而添加,它与map基于 - 的表达式一样好,除非您喜欢for的不仅仅是匿名函数。

于 2013-03-07T15:36:34.810 回答
0

图案已经很简洁了。但是如果你想创建一个代表 afunction 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)
于 2013-03-07T16:27:16.680 回答
0

我认为这里需要画眉操作员。

user=> (-> "a b c d" 
       .toUpperCase 
       (.replace "A" "X") 
       (.split " ") 
       first)
"X"

http://clojuredocs.org/clojure_core/clojure.core/-%3E

http://clojuredocs.org/clojure_core/clojure.core/-%3E%3E

于 2013-03-07T16:29:40.730 回答