超!Gauche入門
簡単なプログラムを書いてみよう!
Gauche(Lisp/Scheme)はとてもシンプルなプログラミング言語です。まずは乱数を使いジャンケンの手(Guu、Choki、Pa)を表示するプログラムを書いてみましょう。リスト1は比較ためにJavaで同じプログラムを書いたものです。リスト2がGaucheのプログラムです。
Gaucheの文法
まずは、Gaucheのプログラムの文法を簡単に説明していきましょう。
数値0.33や文字列"Guu"はJavaと同じくリテラルです。()で括られたものは式で、カッコの中の最初の要素は関数名、それ以外は関数への引数になります。
(
また、;からはじまる行はコメントになります。ではリスト2のプログラムについて上から解説していきましょう。
2行目はsrfi-27という乱数のライブラリを読み込んでいます。4~7行目はguu-choki-paという名前の関数を定義しています、1つの引数を取ります。define は関数や定数を定義するための関数です。
5~7行目は条件によって処理を行うcond関数でJavaのif then else if ... elseに相当します。defineやcond関数は厳密にいうと関数ではなくスペシャルフォームです。
5行目の
6行目はrが0.66より小さければ"Choki"という値をcond関数の値とし、以降(7行目)は実行しません。
7行目はelseがあるのでcondの終わりで"Paa"という値をcond関数の値とします。
9~10行目はjyankenという名前の関数を定義しています。引数はありません。
10行目は0~1の間の乱数を戻す(random-real)を呼び出し、その値をguu-choki-pa関数に渡し、結果をprint関数で表示しています。
12行目はdotimes関数でjyanken関数の呼び出しを10回繰り返しています(ここでは使っていませんが、回数を数える変数はiです)。この、dotimes関数も厳密には関数ではなく、マクロとなります。
どうだったでしょうか? Javaと比べると短く、シンプルですよね。Schemeには式と区別される文はなく、また演算子もありません。
通常の関数はすべての引数の値を評価(計算)してから関数を呼び出しますが、スペシャルフォームやマクロでは引数の評価が行われるタイミングは、そのスペシャルフォームやマクロごとに違います。
例えば関数を定義するdefineでは引数はプログラムなので、コンパイルされるだけであり、評価はdefine関数では行われません。condでははじめから順番に条件部分を評価していき、真になる条件があればそれ以降の条件式は評価されません。