我有以下可以工作的代码:
(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)))如果我将其更改为内联filter (f)并将(m)函数映射到以下内容:
(def *primes*
(let [l "2 3 5 7 11 13 17 19 23 29 31"]
(-> l
(str/partition #"[0-9]+")
(fn [lst] (filter #(< 0 (count (str/trim %))) lst))
(fn [lst] (map #(Integer/parseInt %) lst)))))它不能再编译了。错误是:
#<CompilerException java.lang.RuntimeException: java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol (NO_SOURCE_FILE:227)>
有人能给我解释一下吗?
我试图解决的问题是,map和filter将集合作为最后一个参数,而str/partition将集合作为第一个参数,所以我尝试使用->混合这两个参数,但将map和filter合并到只接受一个(第一个)参数的函数中,以便进入集合。
发布于 2012-01-11 16:41:26
您正在使用函数声明作为函数调用。修复它的直接(丑陋)方法是替换(fn ....)使用((fn .....))
发布于 2012-01-11 16:40:49
您可以在一定程度上混合使用->和->>。
(-> l
(str/partition #"[0-9]+")
(->> (filter #(< 0 (count (str/trim %)))))
(->> (map #(Integer/parseInt %))))但通常情况下,出现这样的问题表明您试图在一种形式中做太多事情。这个简单的例子很容易修复。
(->> (str/partition l #"[0-9]+")
(filter #(< 0 (count (str/trim %))))
(map #(Integer/parseInt %)))发布于 2012-01-23 19:08:34
->是一个宏。它操纵你给它的代码,然后执行这些代码。当你尝试以这种方式使用匿名函数时,之前的表达式会作为第一个参数被线程到fn中。这不是你想要的。您希望将它们作为实际函数的第一个参数进行线程处理。
要使用->,必须事先声明函数,就像您在第一个示例中所做的那样。
https://stackoverflow.com/questions/8815216
复制相似问题