アルゴリズムの基本は分岐と繰り返しにある。どのようなプログミング言語も分岐と繰り返しと入出力とデータ構造(とライブラリ の導入方法)を覚えれば基本的な動作は出来るようになると思う。
Clojureでの分岐は一般的にはifかcondがあればほぼ出来る。ifは
(defn is-small? [number]
(if (< number 100) "yes" "no"))
user=> (is-small? 50)
"yes"
user=> (is-small? 500)
"no"
こんな感じで、多分岐であるcondは以下のようになる。
(defn pos-neg-or-zero
"Determines whether or not n is positive, negative, or zero"
[n]
(cond
(< n 0) "negative"
(> n 0) "positive"
:else "zero"))
user=> (pos-neg-or-zero 5)
"positive"
user=> (pos-neg-or-zero -1)
"negative"
user=> (pos-neg-or-zero 0)
"zero"
condの派生としてcondpがある。これは複数の入力にマッチした時への対応をシンプルに書ける。例えば
(defn condp-test1
[coll]
(condp some coll
#{1 2 3} "coll contains 1 or 2 or 3"
#{4 5 6} "coll contains 4 or 5 or 6"
"coll is other"))
(println (condp-test-2 [1 2 3 4])) ;; coll contains 1 or 2 or 3
(println (condp-test-2 [4])) ;; coll contains 4 or 5 or 6
(println (condp-test-2 [7 8 9])) ;; coll is other
とか
(defn condp-test2
[coll]
(condp some coll
#{"aaa" "bbb" "ccc" "ddd"} "マッチしました"
"マッチしませんでした"))
(condp-test2 ["bbb" "ddd"])
-> "マッチしました"
のようなfiやcondだけで書くと長くなるコードを短く書けことができる。さらにifやcondを使わない分岐とてしてdefunやmatchがある。defunは以下のような感じで特定の文字列が入った時の分岐を記述でき
(use '[defun :only [defun]])
(defun greet
(["JoJo"] "誇りの道を往く者に太陽の輝きを")
(["Dio"] "野望の果てを目指すものに生贄を")
([x] (format "こんにちは,%sさん" x)))
(greet "JoJo")
;; => "誇りの道を往く者に太陽の輝きを"
(greet "Dio")
;; => "野望の果てを目指すものに生贄を"
(greet "Tom")
;; => "こんにちは,Tomさん"
matchはそれが複数の場合となる。
(require '[clojure.core.match :refer [match]])
(doseq [n (range 1 101)]
(println
(match [(mod n 3) (mod n 5)]
[0 0] "FizzBuzz"
[0 _] "Fizz"
[_ 0] "Buzz"
:else n)))
コメント
[…] Mapからのデータの抽出 filterの活用 […]
[…] 非同期処理 各種言語の比較 […]
[…] 非同期処理 各種言語の比較 […]