参考
https://clojure.org/guides/repl/basic_usage#_evaluating_clojure_expressions
Clojure 公式
1 を足す add 関数を作成する
まずは Clojure の関数の使い方をまとめる
( defn add [n]
( + n 1 )
)
JavaScript と比較すると
- 関数宣言は function ではなく defn
- 引数は () ではなく [] で括る
- 処理は {} ではなく () で括る
これらが違う。
#'user/add
user=> ( add 1 )
2
宣言の () を閉じると
現在地に関数が作成された表示がされる
そして普通に使用できる。
サンプルの階乗コードを実行して分析する
https://clojure.org/guides/repl/basic_usage#_evaluating_clojure_expressions
サンプルのコードを作成
(defn factorial [n]
(if (= n 0)
1
(* n (factorial (dec n))))
)
#'user/factorial
factorial は階乗という意味。
中身は下記の通り。
結論 n x (n-1) だが
引数 n が 0 であれば n を 1 にする
引数 n-1 した数値で上記の
引数 n が 0 であれば n を 1 にする
この処理を行い
その後 引数 n-1 を n にかける。
実際に数値を入れた場合の解説
user=> ( factorial 0 )
1
user=> ( factorial 1 )
1
user=> ( factorial 2 )
2
user=> ( factorial 3 )
6
user=> ( factorial 4 )
24
0 の場合
n が 0 なので 1 に変更
n-1 も 0 なので 1 に変更
1 x 1 = 1
1 の場合
n は 1 なのでそのまま
n-1 が 0 なので 1 に変更
1 x 1 = 1
さらに 0 の場合を繰り返し、無限ループを検知して止まる
2 の場合
n は 2 なのでそのまま
n-1 が 1 なのでそのまま
2 x 1 = 2
さらに 1 と 0 の場合を繰り返し、無限ループを検知して止まる
3 の場合
n は 3
n-1 が 2
3 x 2 = 6
2 の場合以降も繰り返して
3 x 2 x 1 x 1 となり終了する。
4 以降は自明。
https://www.javadrive.jp/javascript/function/index15.html
JS でもお馴染みの再起呼び出しを使っていた。
毎回 再帰 って書くと佐伯さんが出てくる、
さえき さんじゃなかったのか
これが REPL -- Read, Exe, Print, Loop の Loop らしい。
まとめ
Clojure は JS の
function, (), {},
これらの代わりに
defn, [], (),
これらを使うが、 JS と同じように関数を作れる
関数の後半に自身を呼び出すことで、
前半までの処理を動かした結果を計算に含める事ができる。
Top comments (0)