clojure備忘録[clojureの基本的な特殊形式 その5(do特殊形式)]

do特殊形式は、ある箇所で複数のS式を順に評価させたいけれども、
わざわざ関数を作るのは面倒くさい、という時に使用します。


do特殊形式は、内部に複数のS式を記述します。
最後に評価されたS式の値が、do特殊系式の返却値となります。

表記

(do & body)

「&」はそれ以降が可変長引数になることを意味しています。
要するに、このような記述が可能になるということです。

(do
  (def a (+ 1 2))
  (if (= a 2)
      (println "a is 2.")
      (println "a is not 2."))
  "Good bye.")

実例

例えばifの中でこのように使用することができます。

(defn pow
  [a b]
  (if (= b 0)
      (do
        (println "乗数が0です。問答無用で1を返却します。")
        1)
      (do
        (println a "の" b "乗を返却します。")
        (apply * (repeat b a)))
      ))

(pow 10 2)
(pow 10 1)
(pow 10 0)

ではreplに食わせてみましょう。

user=> (defn pow
  [a b]
  (if (= b 0)
      (do
        (println "乗数が0です。問答無用で1を返却します。")
        1)
      (do
        (println a "の" b "乗を返却します。")
        (apply * (repeat b a)))
      ))
#'user/pow
user=> (pow 10 2)
102 乗を返却します。
100
user=> (pow 10 1)
101 乗を返却します。
10
user=> (pow 10 0)
乗数が0です。問答無用で1を返却します。
1
user=> 

標準出力へメッセージが表示された後、
ちゃんと計算した結果がreplに返却されています。