32.5 変数の定義と参照

数式が複雑になってくると,その式が何を計算しているかが分かりにくくなります.このような場合,値に名前を付けることで計算の意図をはっきりさせることができます.
例えば,「40人の学生が1時間のうち50分働き10分休むというペースで1日10時間働くことを30日間続けた場合ののべ秒数」を計算を考えてみましょう.

60 * 50 * 10 * 40 * 30;;return2
- : int = 36000000

この計算で確かに答えとなる値は求まりますが,この式を後で見直したときに何の計算を意図しているか分からなくなってしまうことでしょう.
また,この式をもとに後から,

  • 人数を3人増やして
  • 休憩時間が5分間短くなった

場合を計算しようと思った場合,どの部分に“3”や“5”を足せばよいかを間違えずに行うのは至難の技です.
そこで一般的なプログラム言語では,変数を使うことで計算した値に名前をつけることができます.

変数の定義

OCamlでは,

let 変数名 = 式

と書くことで,式を計算した値に名前を付けることができます.
例えば,1分間の秒数“60”に“seconds_per_minute”という名前を付けるときは次のように書きます.

let seconds_per_minute = 60;;return2
val seconds_per_minute : int = 60

これでOCamlに“seconds_per_minute”という名前の変数とその値は整数“60”であることを覚えさせることができます.
変数の名前として“seconds_per_minute”のような英単語の並びを下線記号でつなげたものが使えることに注意して下さい.数学では“a”や“x”のようなアルファベット1文字を変数として使うことがほとんどでした.プログラムでは沢山の変数を使うので,人間にとって意味が分かりやすいように,もっと長い名前の変数名が使えるようになっています.
実際,OCamlでは1文字目がアルファベットの小文字であれば,その後にアルファベットの大文字小文字,数字,そして下線記号“_”が並んだものを変数の名前として使うことができます.ですので,例えば

  • x
  • x1
  • seconds
  • seconds_per_minute
  • myFavoriteSongsIn80s

のような名前は全て変数名として使うことができます.ただし,val, let, fun, end, if, then, elseのような名前は,特別な意味を持っていますので変数名として使うことができません.

変数の参照

変数を定義すると,以降の計算式にその名前の変数があると,そこには変数の値があるとして計算が行われます.
先ほどの変数“seconds_per_minute”を定義した上で次の計算をします.

seconds_per_minute;;return2
- : int = 60
seconds_per_minute * 10;;return2
- : int = 600

ちゃんと変数の値が使われていることがわかると思います.
なお,定義されていない変数を書いた場合はエラーになります.
second_per_minite * 10;;return2
Error: Unbound value second_per_minite

このような時は,ちゃんと変数が定義されているか,またスペルミスがないか確認してください(上の例では“second”の後の“s”がない).

変数の利用例

それでは変数を使って,「40人の学生が1時間のうち50分働き10分休むというペースで1日10時間働くことを30日間続けた場合ののべ秒数」の計算式を書き直してみましょう.

let seconds_per_minute = 60;;return2
val seconds_per_minute : int = 60 (* 1分間の秒数 *)
let minutes_per_hour = 50;;return2
val minutes_per_hour : int = 50 (* 1時間あたりの働いた分数 *)
let hours_per_day = 10;;return2
val hours_per_day : int = 10 (* 1日あたりの働いた時間数 *)
let days = 30;;return2
val days : int = 30 (* 働いた日数 *)
let students = 40;;return2
val students : int = 40 (* 学生数 *)
seconds_per_minute * minutes_per_hour * hours_per_day * days * students;;return2
- : int = 36000000

変数を使ったことで式は長くなりましたが,計算の意図は前よりもはっきりしましたね.
最後の式は長くなったので2行に分かれていますが,OCamlでは複数の行にまたがった式を書いても構いません.キーボードから式を入力している場合は,“;;”が入力されるまでが1つの式として扱われます.
では,1時間あたりの休憩を5分短くして(つまり1時間あたり5分余計に働き),3人学生を追加した場合ののべ秒数を計算してみましょう.今度はどこに3や5を足すかがすぐに分かりますね.
seconds_per_minute * (minutes_per_hour + 5) * hours_per_day * days * (students + 3);;return2
- : int = 42570000

練習として,次のような場合の計算式を変数を使って書いてみてください.

  • 学生の他にフリーターが4名働くことになりました.
  • フリーターの条件は学生と同じですが,日数は10日間です.
  • 学生とフリーターが働いた,のべ秒数を求めて下さい.

どのような変数を用意すると意図がはっきりした式を書くことができるでしょうか?