Clojureで大きな数を扱うときにオーバーフローを防ぐには
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.")