Clojure 为什么->;不带(fn…)吗?

Clojure 为什么->;不带(fn…)吗?,clojure,Clojure,我有以下有效的代码: (def *primes* (let [l "2 3 5 7 11 13 17 19 23 29 31" f (fn [lst] (filter #(< 0 (count (str/trim %))) lst)) m (fn [lst] (map #(Integer/parseInt %) lst))] (-> l (str/partition #"[0-9]+") f m)))

我有以下有效的代码:

(def *primes*
  (let [l "2 3 5 7 11 13 17 19 23 29 31"
        f (fn [lst] (filter #(< 0 (count (str/trim %))) lst))
        m (fn [lst] (map #(Integer/parseInt %) lst))]
    (-> l
      (str/partition #"[0-9]+")
      f
      m)))
它不再编译了。错误是:


#您可以在一定程度上混合
->
->

(-> l
  (str/partition #"[0-9]+")
  (->> (filter #(< 0 (count (str/trim %)))))
  (->> (map #(Integer/parseInt %))))
(-l>
(str/partition#“[0-9]+”)
(>>(过滤器#)(<0(计数(str/trim%)))))
(->(映射#(整数/parseInt%))
但通常有这样的问题是一个迹象,表明你试图做太多的一种形式。这个简单的例子很容易修正

(->> (str/partition l #"[0-9]+")
  (filter #(< 0 (count (str/trim %))))
  (map #(Integer/parseInt %)))
(>>(str/partition l#“[0-9]+”)
(过滤器#(<0(计数(str/trim%)))
(映射#(整数/parseInt%))

您可以在一定程度上混合
->
->

(-> l
  (str/partition #"[0-9]+")
  (->> (filter #(< 0 (count (str/trim %)))))
  (->> (map #(Integer/parseInt %))))
(-l>
(str/partition#“[0-9]+”)
(>>(过滤器#)(<0(计数(str/trim%)))))
(->(映射#(整数/parseInt%))
但通常有这样的问题是一个迹象,表明你试图做太多的一种形式。这个简单的例子很容易修正

(->> (str/partition l #"[0-9]+")
  (filter #(< 0 (count (str/trim %))))
  (map #(Integer/parseInt %)))
(>>(str/partition l#“[0-9]+”)
(过滤器#(<0(计数(str/trim%)))
(映射#(整数/parseInt%))

您将函数声明用作函数调用。立即(丑陋的)修复方法是将(fn[…]…)替换为((fn[…]…)

将函数声明用作函数调用。直接(丑陋的)修复方法是将(fn[…]…)替换为((fn[…]…)

->是一个宏。它操纵您给它的代码,然后执行该代码。当您尝试像那样内联使用匿名函数时,会发生的情况是前面的表达式作为fn的第一个参数被线程化。那不是你想要的。您希望将它们作为实际函数的第一个参数线程化


要使用->,您必须事先声明函数,就像您在第一个示例中所做的那样。

->是一个宏。它操纵您给它的代码,然后执行该代码。当您尝试像那样内联使用匿名函数时,会发生的情况是前面的表达式作为fn的第一个参数被线程化。那不是你想要的。您希望将它们作为实际函数的第一个参数线程化


要使用->,您必须事先声明函数,就像您在第一个示例中所做的那样。

请看,这就是我最终要做的事情