2011-05-19 54 views
7

我正在使用教程學習Clojure,並且遇到類似4clojure99 lisp problems的問題。我在解決問題方面做得很好,但是我的代碼似乎總是像下面的例子那樣混亂。如何自己學習Clojure的方法?

對於一種像Clojure一樣靈活的語言,初學者如何學習慣用的方法,而不必讓別人手牽着手?

我亂七八糟的例子:

(defn intersectall [lset] 
    (when-not (empty? (first lset)) 
    (if (reduce #(and %1 %2) (map #(stars/member* (front lset) %) (rest lset))) 
     (cons (front lset) (intersectall (cons (rest (first lset)) (rest lset)))) 
     (intersectall (cons (rest (first lset)) (rest lset)))))) 

如果你想知道,該功能intersectall僅僅返回輸入的所有子列表的共同元素的列表。

所以對:

(def lset '((6 :pears :and) 
     (3 :peaches :and 6 :peppers) 
      (8 :pears :and 6 :plums) 
     (:and 6 :prunes :with some :apples))) 

=> (intersectall lset) 
(6 :and) 

這個問題是來自於小策士第117

+0

你應該在[Google Clojure組]上發佈這類問題(http://groups.google.com/group/clojure?pli=1)。 – 2013-06-17 07:12:15

回答

12

如果你真的想獲得Clojure,我強烈推薦The Joy of Clojure的書。它是由兩位知道原始創作者旁邊最好語言的人寫的。他們解釋你可以做什麼,你應該怎麼做,然後解釋爲什麼。我認爲這不是一門很好的FIRST書籍/學習經驗,但是我認爲這是從你掌握基礎知識開始學習的第二本書。

+0

+1表示它是您的第二本書。 (我還會加上你的第三本書:)) – stand 2011-05-19 20:58:41

+0

@stand:如果你要求我補充我的第三本書,那麼目前可用的clojure書籍都沒有成功,儘管我很想抓住Clojure Programming和看看這些與其他事情是否相符。個人在JoC之後,我會去freenode的郵件列表和IRC頻道。 – Runevault 2011-05-20 20:02:15

+4

抱歉,我不清楚。我的意思是,在你閱讀JoC作爲你的第二本書之後,你應該再次閱讀它作爲你的第三本書。 – stand 2011-05-20 21:52:34

1

讀碼。閱讀寫得很好的代碼。

您可以從clojure的源頭開始 - 在此處獲取:https://github.com/clojure/clojure/tree/master/src/clj/clojure。通常,一種語言的標準庫中的代碼必須相當習慣。所以這是開始你的旅程的好地方。

+2

你真的要告訴初學者從Clojure的源頭開始編程嗎? – JasonFruit 2011-05-19 16:39:26

+4

做*不*閱讀clojure.core的靈感。其他軟件包可能沒問題,但核心是以性能爲中心的,並且通過根據編譯器基元定義整個標準庫來忙於自舉。 – amalloy 2011-05-19 17:07:16

+1

我同意clojure.core在地方可能會非常棘手 - 但我個人發現它在學習Clojure時非常有幫助。我認爲YMMV--對於那些對內部工作感興趣的初學者來說,肯定值得一看。 – mikera 2011-05-20 05:35:14

4

寫入和讀取代碼都是合適和必要的。如果Clojure源代碼看起來很嚇人,那麼從較小的項目開始,例如https://github.com/technomancy/robert-hooke。既然你一直在做4Clojure的問題,爲什麼在你寫完自己的文章後不看別人的解決方案呢?在Twitter上搜索#4clojure或者訪問https://twitter.com/#!/search/%234clojure

祝你好運!

+0

我同意 - 4Clojure的一個關鍵學習方面是審查他人的答案。 您可以找到所有級別的解決方案質量,這些解決方案的質量顯然只是一個解決方案,只是將解決方案包裹在一個簡短而簡明的解決方案中,您可以花幾天時間研究如何優雅地完成解決方案。 – rmp 2017-10-18 16:24:27

2

將您的代碼抽象成能夠完成一件事情和一件事情的小功能。一旦你完成了這個,你可以試着讓它更加優雅。有時候你會注意到你的最終結果是如此的甜美和短暫,你實際上最終將其內聯。

通過使用let來綁定已獲取的值。例如,在幾個不同的地方多次調用(first lset)會使您的代碼更加冗長。

1

我會建議解構一個複雜的例子。在丹佛Clojure聚會上,我們解構了Clojure的快樂 Quicksort列出6.3逐行。我有幻燈片here

0

Clojurecademy是一個教授Clojure的交互式平臺,它對Clojure的學習非常有幫助和容易。