2014-09-23 42 views
1

所以我一起砍了,但我相信我有很多要學習clojure!我已經有了正確的答案,但對我而言,這僅僅是一個開始。通過弄清我應該如何思考這個問題,幫助我更好地理解口頭禪。我是一個傳統的OO開發者...所以,lisp並沒有進入我的腦海。clojure幫助我在列表中分組項目變得更好

(def v [:a :a :a :b :b :c :c :c]) 

(def a (first(partition-by identity v))) 
(def b (flatten(rest (partition-by identity v)))) 
(vec(conj (list b) a)) 

想要得到我已經在上面編碼的結果,但沒有Frankenstein語法的結果。我希望你能幫助我。 上面我的代碼的結果是: [(A:A:A)(B:B:C:C:C)]

+0

你會怎樣來實現?組的起始元素,直到指針遇到不同的?和其他元素的其餘元素? – 2014-09-23 06:13:16

回答

2

這個功能怎麼樣?

(defn my-group [[x & _ :as xs]] 
    (split-with (partial = x) xs)) 

讓我們嘗試的功能:

user> (my-group [:a :a :a :b :b :c :c :c]) 
;; => [(:a :a :a) (:b :b :c :c :c)] 
user> (my-group ["foo" "foo" "bar" "bar" "bar" "baz" "foo"]) 
;; => [("foo" "foo") ("bar" "bar" "bar" "baz" "foo")] 
+0

&_是什麼意思? – hidden 2014-09-24 14:52:15

+0

通常,'_'代表不重要的變量。整個結構'[x&_:as xs]'就是[解構](http://blog.jayfields.com/2010/07/clojure-destructuring.html)的例子。 'x'包含list的第一個元素的值,'_'用於忽略其餘部分,':as xs'將符號'xs'綁定到整個列表。析構是Clojure的一個重要特性,它經常被使用,所以我建議你學習它,而不是忽略它。 – Mark 2014-09-24 14:58:17

+0

謝謝,我知道它。 – hidden 2014-09-24 15:03:16

1

我的理解是,你想是這樣的:

(let [[a & r] (partition-by identity v)]                              
    [a (apply concat r)])