プログラミング in OCaml メモ
12.2 自分自身のメソッドを呼び出す
12.2.1 補助的メソッドと private メソッド
ここで、電卓プログラムを例にして説明がされてあるけど、電卓プログラムの仕組みについて、本文では簡単に説明されてあるが、自分なりに考えたので、メモしておく。
class calc_many_buttons =
object (self)
val mutable num = 0
val mutable func = fun x -> x
(* 数字入力メソッドから使われる補助メソッド shift *)
method shift n = num <- num * 10 + n (* 0 <= n <= 9 *)
method zero = self#shift 0
method one = self#shift 1
method two = self#shift 2
method three = self#shift 3
method four = self#shift 4
method five = self#shift 5
method six = self#shift 6
method seven = self#shift 7
method eight = self#shift 8
method nine = self#shift 9
method plus =
let x = num in <== (1)
func <- (fun y -> x + y); <== (2)
num <- 0 (* num を 0 クリアする *) <== (3)
method eq =
let r = func num in <== (4)
num <- 0; (* num と func をクリアする *) <== (5)
func <- (fun n -> n); <== (6)
r
end;;
まず、クラスのインスタンスを作成する。
let c = new calc_many_buttons;;
数字を入力する。
c#one; c#zero;
これは、「1」「0」と入力したことになる。
shift メソッドにより、「10」と入力したのと同じになる。
この値が num に代入されている。
次は、これである。
c#plus;
(1) — num を x としている。この時点で、num には、「10」が入っているから、x は 10 である。
次に(2)の処理。
(2) — インスタンス変数 func には、もともと (fun x -> x) という恒等関数が入っていた。
ここでは、func を (fun y -> x + y) という関数に置き換えている。
これは、引数y と x をたすという関数。これが func という変数に代入されている。
そして、num は x になっているので、ここで、num をゼロにしている。
c#two; c#nine;
これは、「29」と入力したのと同じである。その値が num に代入されている。
c#eq
(4) の処理がまず行われる。この時点では、変数func には、(fun y -> x + y) が入っている。
x には、(1)で、「10」が入っている。
num には、「29」が入っている。
だから、func num = (fun y -> 10 + y) num ということになる。
その結果が r にセットされる。
(5) — num をゼロにする。
(6) — func をもとの (fun x -> x) にする。
そのあと、r を返り値としてしている。
このプログラムについてのメモは、以上である。