超!Gauche入門

2008年5月23日(金)
吉田 裕美

簡単なプログラムを書いてみよう!

 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でははじめから順番に条件部分を評価していき、真になる条件があればそれ以降の条件式は評価されません。

CADのベンチャー企業を経て、独立し有限会社EY-Officeを設立。Java、Ruby、PerlなどでWebアプリを中心に開発を行ってきたが、現在は、教育に注力し「問題解決型の教育」に奮闘中。「Gauche-Trac(http://www.ey-office.com/gauche)」に今回の記事のサポートページを作りましたのでご活用下さい。HP:http://www.ey-office.com。Blog:http://d.hatena.ne.jp/yuum3

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています