Matchingによる分岐

機械学習技術 人工知能技術 デジタルトランスフォーメーション技術 ITインフラ技術 Web技術 プログラミング技術 ICT技術 Clojure Javascript CSS 本ブログのナビ

 

アルゴリズムの基本は分岐と繰り返しにある。どのようなプログミング言語も分岐と繰り返しと入出力とデータ構造(とライブラリ の導入方法)を覚えれば基本的な動作は出来るようになると思う。

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)))

 

コメント

  1. […] Mapからのデータの抽出 filterの活用 […]

  2. […] 非同期処理 各種言語の比較 […]

  3. […] 非同期処理 各種言語の比較 […]

タイトルとURLをコピーしました