Previous ToC Next

2. 文法1 変数と型 (2020/1/18)

2.1. 変数とプログラムの基本

Crystal による数値計算入門2回目です。多くのプログラム言語、特にCrystal の文法のもとになっている Ruby と同じように、 Crystal では「変数」とい うものを使って、それに「値」をいれたり、その「値」を使って計算したり できます。

 a=1
 b=2
 print a+b, "\n"
を作って、実行すると

 gravity> crystal run add.cr
 3
という出力になります。 関数は、普通は foo(a,b) といったふうにその引数 を 括弧でくくりますが、 Crystal は近年の多くの言語と同じように関数のあ との括弧を省略できます。なので

  print(a+b, "\n")

  print a+b, "\n"
は同じ意味になります。さて、

  a=1
は、多くのプログラム言語で使っている代入の表現で、等号の左側の変数の値 を右側の式の値にします。もしも、左側の変数にすでに何か値がはいっていた ら、その値は捨てられて新しい値に書換えられます。 「=」という等号記号な のに、数学的な等号ではなくて、「代入」であることには注意が必要です。

「a」は変数名で、ここでは1文字ですがアルファベットの小文字から始まり、 アルファベット、数字、「_」(アンダースコア)からなる文字列であればなん でも使えます。長さの制限も特にないはずです。つまり、

 a1
 a_1
 abcdefghijklmnopqrstuvwxyz01234567890_ABCDEFGHIJKLMNOPQRSTUVWXYZ
 z_y_x_w_v_u_________________0
 
といったものはどれも変数名に使えます。

プログラムの意味としてもうひとつ重要なことは、プログラムは上から1行づ つ順番に実行される、ということです。つまり

 a=1
 a=2
 b=a

 a=1
 b=a
 a=2
は結果が違い、上では b は2、下では1になります。

2.2. 型(クラス)

さて、aという名前の変数の値が 1 になるわけですが、計算機の中で 1 という 値を表現する方法は色々ありえます。代表的なものが、

といったところです。例えば Fortran では(暗黙の宣言は使わないとして)

  integer i
  real*8  a
といった形で、また C/C++ なら

  int i;
  double a;
といった形で最初に変数の「型」を宣言し、それから使う、ということをしま す。一方、Python や Ruby (と書くのは面倒なので以下大抵単に Ruby を例に します)では、 Crystal の例と同様に

  a=1
といきなり書くことができます。Ruby では、言語が動的である、つまり、型 が実行時に定まることで、宣言を不要にしています。上のケースでは、右辺の 式(というか定数 1)が、Ruby の文法として「整数定数」を表すことに決まっ ているので、その値が整数になり、それを代入される変数 a の型は、代入さ れた時点で整数になるわけです。Crystal は、コンパイルされる言語なので 実行時ではなくコンパイルの時点で型が決まります。明示的に型が宣言されて いない変数については「型推論」を行います。

 a=1
の場合では、右側の型が整数なので、左側の型も整数にしておこう、というこ とになるわけです。

 a=1.0
と書けば、 1.0 は浮動小数点数型定数なので、a の型も浮動小数点型になり ます。

 a=1
 print a.class,"\n"
 a=1.0
 print a.class,"\n"
 b=2
 print a+b, "\n"
を実行すると

 Int32
 Float64
 3.0
となり、 1 の代入後の a の型(クラス)は Int32、 1.0の代入の後は Float64 になっていて、 a+b の計算結果も 3.0 となっていて b が浮動小数点に変換 されてから計算されたことがわかります。ここで、 変数名.関数名 とコンマでつな ぐのは、 その関数 がその変数の属する型の「インスタンスメソッド」で、そのメソッ ドを foo に適用している、ということです。

といわれてもよくわからないですよね、、、 bar が(古い)Fortran や Cでのやサブ ルーチンと思ってもらってよいのですが、2つ違いがあります。

  1. Fortran や Cでは 関数名(変数名) と書くところを、 変数名.関数(メソッ ド)名 と書く
  2. 変数の型が違えば、関数名が同じでも別の関数になって、動作を別に定義で きる。

1 は本当に見かけの問題ですが、どうしてこうしたいかは次の章で出す例で詳 しく解説します。2についても、次の章でもう少し色々なメソッドの例をみて からにしましょう。

Crystal の整数型には Int8, Int16, Int32, Int64, Int128 と、それぞれの符 号なし型である UInt8, ... Uint128 の12種類、浮動小数点型には Float32 と Float64 の2種類があります。整数定数は、

 1 : Int32
 1_i8 :  Int8
 1_u8 :  UInt8
 
で、同様に 16, 32, 64, 128 を指定できます。浮動小数点型定数は

 1.0:     Float64
 1.0_f32: Float32
 1.5e10:  Float64
という感じです。

2.3. まとめ

2.4. 課題

  1. 2つの変数 a, b に整数値をいれ、四則演算(加減乗除)の結果を出力するプ ログラムを作成・実行し、結果が正しいことを確認せよ。
  2. 浮動小数点(Float64)の値で同様なことを行え。
  3. 2つの変数 a, b に値をいれ、出力したあと、a, b の値を入れ換えて、ま た出力するプログラムを作成、実行して結果が正しいことを確認せよ。
  4. 整数と浮動小数点数の四則演算の結果がどうなるか、値と型を、Crystal のドキュメントの記載を確認すると共に、実際のプログラムを作成して確認せよ。

2.5. 参考

https://crystal-lang.org/api/0.32.1/Int.html

https://crystal-lang.org/api/0.32.1/Float.html

Previous ToC Next