2014-09-24 60 views
-1

正如你所看到的,我的第一個元素以某種方式被跳過......至少println認爲它是。clojure使用map來計算元素的列表向量

(def example [(:1 :1 :1) (:2 :2 :2 :2) (:3 :3)]) 
(println example) 
(defn countEachSequence [vec] 
    (println vec) 
    (let [varName (count vec)] 
    (println varName) 
    ) 
) 
(map #(countEachSequence %) example) 

所需的輸出是: ([1 3] [:2 4] [:3 2])

這是命名組和計數該組中的元素的量。

回答

2

這似乎是你想要什麼:

(defn count-each-seq [v] 
    (map (fn [s] [(first s) (count s)]) v)) 

以上count-each-seq函數返回向量的序列。您可以稍後打印。 如果您在REPL中運行該功能,結果將立即顯示。

有三樣東西在你的代碼的說:

  • 當你編寫代碼,您應該分開的核心邏輯和演示(在這種情況下,println)。你的函數應該返回一個值。
  • 您的參數vec實際上是一個函數名稱clojure.core/vec。選擇與現有函數名稱不衝突的其他名稱。
  • 在單詞之間使用破折號是clojure(或LISP)約定。因此,像count-each-sequence這樣的名稱而不是駱駝案例。
+3

'(defn count-each-seq [v](map(juxt first count)v))' – noisesmith 2014-09-24 23:20:48

+0

@noisesmith哇。看起來更緊湊。 – ntalbs 2014-09-24 23:58:40

+0

這是一回事,只是利用'juxt'而不是手動構建向量 – noisesmith 2014-09-25 00:30:28