勉強して2週間の感想

これはClojure Advent Calendar 2013 - Qiita [キータ]22日目の記事です。

 

プログラミング歴半年がClojureを勉強した感想を書きたいと思います。

 

まず私はプログラミング言語は主にjavaを勉強していて、Lispというものは、初めて知った次第です。

 

 

・コードが短い

最初の印象は、「えっ、これで動いちゃうの?」というかんじで

コードがすごく短くて驚きでしたね。

ものによっては、Javaの数行が1行になっちゃたり、すごいです、感動です、万歳。

 とテンション上がったのですが、

それから勉強を進めていくと、やはり思いました。

 

 

・カッコ多い

「うん、カッコめっちゃ多いね」

参考書の最初のほうでLispはカッコ地獄だよと脅されていたのですが、

やっぱり多い。

Clojureはカッコ少ないとか言ってるし、これで少ないとかLispすごいな。

あとコマンドプロンプトって間違いに気づいても戻れないから、何回も最初から書き直すハメに。

多少慣れてきたけど毎回カッコの確認作業です。

 

 

・束縛か配列か?

 参考書にこういうコードがありました。

(defn count-heads-pairs [coll]

  (loop [cnt 0 coll coll]

   (if (empty? coll)

    cnt

     (recur (if (= :h (first coll) (second coll))

                    (inc cnt)

                    cnt)

                 (rest coll)))))

 このloopの引数が最初4つの値を持つ配列だと思っちゃいました。

でもcntに0、collに同じ名前ですが1行前のcollを束縛していて、

値としては2つだったんですね。

[ ]←これが配列だよーって認識していました。

 

 

・最後に

アドベントカレンダーというものを知って参加してみたのですが、

あんまり面白いこと書けなくてすいません。

素直にClojureは面白いと感じました。

Javaと全然違うし、

参考書の言い回しを引用すると自然言語的にコードを書けるし、

遅延シーケンスとかすごいです。

これからも勉強がんばります!!

 

 

今日も問題やりました

今日もウェブにある問題に挑戦してみたので、書いてみます。

 

まず問題

3桁の数の積で表される回文数の最大値を求めよ

 回文数っていうの左右どちらから読んでも、同じになる数字のことだそうです。

12321みたいな。

 

で、コードは

まず回文数かどうかを判断する述語を作りました。

 

(defn kaibun? [val]

  (if (= (str val) (apply str (reverse (str val) ) ) )

    true

    false

  )

)

カッコめっちゃ多いですね。

そして次に3桁の数の積のシーケンスを定義しました。

これが難しかった。

 

(def big-seq (loop [vec [] val 100]

  (if (= val 1000)

    vec

    (recur (into vec (for [n (take 900 (iterate inc 100))] (* n val))) (inc val))

  )

))

 3桁の数の積を全部取ってきてます。

これこそ遅延シーケンスの真骨頂なんですかね?

評価したらすごいことになりました。

 

であとはフィルターにかけると

 

(filter kaibun? big-seq) 

 ずらっ~~と結構な数が出てきました。

シーケンス内の最大値を取ってくれる関数とかないのかな?と

ちょっと探したのですがないかもなんで、力技

パッと見、900000台を見つけたので、

 (filter #(< 900000 %) (filter kaibun? big-seq))

 したら、結果が(906609 906609)

 

素晴らしい! 最大値は906609です。

 

何と何をかけたのかもわかりませんが、906609です。力技万歳!!

以上、終了。

 

 

 

 

多少慣れてきました

Clojureに少しづつですが慣れてきました。

今日はネットにあった問題をClojureで書いてみたので、ちょっと公開してみます。

まず問題が

 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ

 

でコードは

まず3と5の倍数をとる関数を作成

  (defn get3or5 [x]

    (if (or (zero? (rem x 3)) (zero? (rem x 5))) x))

 

そして3と5の倍数だけで任意の数の中身を持つシーケンスを作る関数を作成

  (defn array3or5 [int]

    (for [n (take int (iterate inc 1)) :when (get3or5 n)] n))

 

あとはシーケンスの中身を全部足す

  (reduce + (array3or5 999))

 

結果は233168でした。まぁ当ってるかわかんないんですけど。

 

 

やっぱりカッコが多いですね。

どこでカッコを終わらせればいいか不安になってきます。

実際エラーを連発させました。

 

 

 

Clojure始めました。

はじめまして、プログラマー歴半年の初心者な人間です。

 

このたびClojureを勉強し始めましたので、その経過や感想などを綴っていこうと思っております。

 

まず

いきなりleiningenのインストールに苦戦しました。

OSがWindows 7 なのですが、環境変数わけわからん

というレベルなので四苦八苦です。

 どれに環境変数の設定が必要で、どれに要らないかがよくわかってない・・・。

 

ググりながらなんとか進めると結論は簡単でした。

leiningenをインストールするフォルダをあらかじめシステム環境変数に新規追加すればいいようだ。

ユーザー環境変数とシステム環境変数のふたつがあって迷ったが・・・。

 

あとはインストーラーが勝手にやってくれて終了でした。

 

あんまりよくわかっていないのに先に進んでよいのか不安だが、とりあえず終了、先に進みます。