我已经开始学习clojure了。我坚持在->>
宏
代码是:
(defn make-summary [wordStr]
;// split string into words
(let [words (clojure.string/split wordStr #"[\[\]\(\),.\s+]")
;// convert words to lowercase.
lowerCaseWords (map clojure.string/lower-case words)]
;// remove stop words
(->> (remove-stop-words lowerCaseWords)
;// count the frequency of words
;// ---------- HERE IS THE PROBLEM ------------------------------
(let [totalWords (count )] ;// <--- HOW TO MAKE MACRO PUT THE THING HERE ???
(count-frequency)
;// sort on the basis of frequency
(sort #(> (get %1 1) (get %2 1)))
;// find the keywords
)
)))
我陷入了defn函数内的第二个let
。
我该如何编码呢?
答案 0 :(得分:4)
您可以将原始代码与as-&gt;一起使用。在clojure 1.5中添加了线程宏 而不是将其参数插入到每个表单的第一个( - &gt;)或最后一个( - &gt;&gt;)位置,它允许您指定位置:
(as-> [1 2 3] x
(conj x 4)
(map inc x)) ;=> '(2 3 4 5)
我认为,建议是使用 - &gt;或 - &gt;&gt;当你可以而且只能回到as-&gt;如果这不容易做到。 @Thumbnail的汇总功能是您获得的可读性的一个很好的例子 - &gt;&gt;。
你可以想到as-&gt;作为以下代码的便捷简写:
(let [x [1 2 3]
x (conj x 4)
x (map inc x)] x)
以下是使用as-&gt;编写代码的相关部分:
(as-> (remove-stop-words lowerCaseWords) x
(let [totalWords (count x)] .....
答案 1 :(得分:2)
关注@ DiegoBasch的建议......
如果您正在寻找
->>
宏然后以下可能适合:
(defn summarise [text stop-words]
(->> text
(re-seq #"[a-zA-Z]+")
(map clojure.string/lower-case)
(remove stop-words)
frequencies
(sort-by (comp - val))
(map key)))
例如
(summarise "Mary had a HUGE a lamb" #{})
("a" "mary" "had" "huge" "lamb")
(summarise "Mary had a HUGE a lamb" #{"huge"})
("a" "mary" "had" "lamb")
注释
(set (map clojure.string/lower-case stop-words))
代替
stop-words
中的remove
。否则用大写字母停止
信件无效。 答案 2 :(得分:0)
不能让->>
在除表单最后一项之外的任何位置插入参数。但这可以用于实现它的技巧:
(defn make-summary [wordStr]
;// split string into words
(let [words (clojure.string/split wordStr #"[\[\]\(\),.\s+]")
;// convert words to lowercase.
lowerCaseWords (map clojure.string/lower-case words)]
;// remove stop words
(->> (remove-stop-words lowerCaseWords)
;// count the frequency of words
(fn [LCW] (let [totalWords (count LCW)] ;// <--- HOW TO MAKE MACRO PUT THE THING HERE ???
(count-frequency)
;// sort on the basis of frequency
(sort #(> (get %1 1) (get %2 1)))
;// find the keywords
)
))))
我所做的是将函数包装在函数中,现在你可以将参数放在任何地方。