使用let inside - >>宏

时间:2014-08-02 16:36:05

标签: clojure

我已经开始学习clojure了。我坚持在->>

中使用let

代码是:

 (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

我该如何编码呢?

3 个答案:

答案 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

        )
        ))))

我所做的是将函数包装在函数中,现在你可以将参数放在任何地方。