プログラミング 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 を返り値としてしている。

このプログラムについてのメモは、以上である。