2011-05-19 84 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的学习非常有帮助和容易。