Clojureで大きな数を扱うときにオーバーフローを防ぐには

桁が大きい数の場合、オーバーフローを防ぐために対数をとるとよい のですが、Clojureの場合どうすば、logが使えるのか疑問におもったので 検索したら見つけました。

Logarithm with base 2 (log2)

(defn log2 [n]
  (/ (Math/log n) (Math/log 2)))

4clojure #72 Rearranging Code: ->>

4clojure #72 Rearranging Code: ->>

->>マクロは複数のフォームを経由して式xをつなげる。 はじめに、xは第一フォームに最後として挿入され、 それがすでにリストでなければリストを生成する。 それから、第一フォームは第二フォームへ最後のアイテムとして挿入され、 必要ならばそのフォームのリストを作る。 このプロセスが全フォームにわたって繰り返される。 ->>をつかうことは時に、コードを読みやすくします。

(= (__ (map inc (take 3 (drop 2 [2 5 4 1 3 6]))))
   (->> [2 5 4 1 3 6] (drop 2) (take 3) (map inc) (__))
   11)

答え

reduce +

プログラムは書いたとおりに動くのか

プログラムは書いたとおりに動くのか

入力データの仕様と出力データの仕様が決まってからプログラムが書かれるのではなく、 プログラムを書きながら、バージョンアップを重ねながら、 当初見えなかったデータの「かたち」を彫り出して、 思いもかけなかった出力を得てゆく、 そういう「プログラミング」の重要性が増してゆくかもしれない。

プログラミングの手法についての、考察がすばらしかったので引用しました。

4clojure #71 Rearranging Code: ->

4clojure #71 Rearranging Code: ->

-> macro複数のフォームを経由して式xを通す。 はじめに、xは第一フォームに第二要素として挿入され、 すでにリストでない場合、そのリストを作る。 そして、第一フォームは第二フォームに第二要素として挿入され、 フォームが必要ならば、リストを作る。 この過程は全フォームにわたって繰り返される。 ->の使用はときにコードをより読みやすくします。

(= (__ (sort (rest (reverse [2 5 4 1 3 6]))))
   (-> [2 5 4 1 3 6] (reverse) (rest) (sort) (__))
   5)

答え

last

4clojure #70 Word Sorting

4clojure #70 Word Sorting

センテンスを分割してソートした単語リストにする関数を作る。 大文字小文字はソート順に関係なく、句読点も無視すること。

(= (__  "Have a nice day.")
   ["a" "day" "Have" "nice"])
(= (__  "Clojure is a fun language!")
   ["a" "Clojure" "fun" "is" "language"])
(= (__  "Fools fall for foolish follies.")
   ["fall" "follies" "foolish" "Fools" "for"])
((fn [str]
  (sort-by
    (fn [s] (.toLowerCase s))
  (re-seq #"\w+" str )))
 "Have a nice day.")