Clojure入門 - Project Eulerを解いてみる 問1
Pragmatic Programmerのアドバイス
毎年一つ新しい言語を学ぶべし
に従って、今年はClojureを勉強したい。(ちなみに去年はCをちゃんと勉強するというのが目標。ある程度は実践できた)
去年の最後の週から少しずつ文法などを見てみた。以前からSchemeについては少し触れていた(SchemeというかDr Racketだが)ので比較的楽。
map
、reduce
やfilter
などのいわゆる関数型言語的な書き方はPythonでもお馴染み。
今年の最終目標はClojureでSICPを読み解いていくこと。Clojureに慣れ次第読み始めて、一年をかけて読破したい。
とりあえず手始めにProject Eulerの問題を解いていって慣れていこうと思う。Concurrencyも使ってみたい。
まず第一問。
ここからネタバレ
(defn predicate [x] (or (= 0 (mod x 3)) (= 0 (mod x 5)))) (println (reduce + (filter predicate (range 1000)))
やっていることは比較的簡単。はじめはrange
を無制限で使ってfilter
したものをtakewhile
で1000以下に絞り込む方向で考えたのだが、大本を1000でくくったほうが絶対楽なことに気付いた。
ちなみにPythonで書くなら
def predicate(x): return x%3==0 or x%5==0 print(sum(filter(predicate, range(1000))))
なのでまあほぼ同じ。Peter NorvigもPythonとLispは超似てる(意訳)とおっしゃっていることだし、まあ当然といえば当然か。
今後Clojureを勉強していくにつれ、書き方が変わっていくのだろうか。是非今年の終わりあたりに見直してみたいものだ。