如何自己学习Clojure方式?

时间:2011-05-19 15:17:28

标签: clojure idioms

我正在使用教程学习Clojure,并遇到4clojure99 lisp problems等问题。我解决问题很好,但我的代码似乎总是像下面的例子一样混乱。

对于像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)

这个问题来自The Little Schemer第117页。

6 个答案:

答案 0 :(得分:12)

如果您真的想要获得Clojure,我强烈推荐The Joy of Clojure本书。它是由两位了解原始创作者旁边最好的语言的人写的。他们解释你可以做什么,你应该怎么做,然后是为什么。我不认为这是关于该语言的良好的第一本书/学习经验,但是我认为这是你从基础开始学习所需的第二本书。

答案 1 :(得分:4)

写作和阅读代码都是恰当和必要的。如果Clojure源代码看起来令人生畏,请从较小的项目开始,例如https://github.com/technomancy/robert-hooke。既然你一直在做4Clojure问题,为什么不在你自己写完之后再看看别人的解决方案呢?在twitter中搜索#4clojure标签或只访问https://twitter.com/#!/search/%234clojure

祝你好运!

答案 2 :(得分:2)

将您的代码抽象为较小的函数,这些函数可以完成一件事。一旦你实现了这一点,你可以尝试使它更优雅。有时你注意到你的最终结果是如此甜蜜和短暂,你实际上最终会将其内联。

使用let绑定您已获得的值。例如,在几个不同的地方多次调用(first lset)会使您的代码更加冗长。

答案 3 :(得分:1)

阅读代码。阅读写得很好的代码。

你可以从clojure的源码开始 - 在这里得到它:https://github.com/clojure/clojure/tree/master/src/clj/clojure。通常,语言的标准库中的代码必须是非常惯用的。所以这是开始旅程的好地方。

答案 4 :(得分:1)

我建议解构一个复杂的例子。在Denver Clojure Meetup上,我们逐行解构了 Clojure的欢乐 Quicksort列表6.3。我有幻灯片here

答案 5 :(得分:0)

Clojurecademy是一个教授Clojure的互动平台,它非常有用且易于学习Clojure。