Gaucheの使い方

Gaucheの使い方

 Gaucheでプログラムを実行する場合は、大きく3つの方法があります。

 1つ目は、プログラムを書いたファイルを作り、Cygwin Bash Shellやshell上で「goshプログラムファイル」とタイプし実行する方法です。

 2つ目は、Cygwin Bash Shellやshell上でgoshとだけ入力し、gosh>というプロンプトが表示されたら、そこにプログラムを直接入力しながら実行する方法です。エディタで作ったプログラムをコピー・ペーストしながら、プログラミングを進めていくこともできます。

 3つ目は、emacs(Meadow)上でC-c S(Ctrl+cの後にSを入力)でgoshを走らせ、別のウィンドウにあるプログラムをC-x C-e(Ctrl+xの後にCtrl+e)で与えながら実行する方法です。

 後に説明した方法ほど、能率良く開発が行えます。

Lispのデータ構造S式

 Gauche(Lisp/Scheme)が扱うデータは、数値や文字列、ベクターやハッシュなどJavaやPerlなどと同じようなデータ以外に、シンボルやS式というものがあります。

 シンボルとは変数名や関数名のように何か実体につけられた名前です。ただし、実体の無い単なる名前としても使います。

 S式とは前ページのプログラムで見たように()内に要素を並べたもので、リストとも呼ばれます。要素は数値や文字列のようなリテラル、シンボル以外にS式も書けます。したがって、S式は入れ子になった構造を表現できるので、いろいろなデータ構造を表すことが可能です。

 実はGaucheが扱うデータはプログラムを含めすべてS式です。S式の一部分としてリテラルやシンボルも含まれます。

 リスト4は、リスト3のHTMLと同等の内容をS式で表しています。HTMLでは、

Gauche Web Page

のように開始タグ、内容、終了タグの構造をしていますが、単純なHTML要素の場合、開始タグと終了タグの違いは/だけなので、ここでは (タグ名 内容...)というS式で表すことにします。内容が数値や文字列の場合は、Gaucheの数値、文字列で書きます。

 また、要素内部に

要素や、要素が入れ子になっている構造は(タグ名 内容...)の内容部分が入れ子になることで表現しています。

 それでは次に、このS式を与えると対応するHTMLを出力するプログラムを作ることにします。

再帰的呼び出し

 リスト5に、S式を与えると対応するHTMLを出力するプログラムを示します。それでは、各関数の処理について説明していきましょう。

 まずは、print-htmlです。これは、1つのHTML要素に対応する処理を行います。与えられたeがリストなら、最初の要素がタグ名なので

のような開始タグを表示し、残りのリストは入れ子になったHTML要素の並びかもしれないので、HTML要素の並びを処理するprint-html-listを呼び出します。そして、

のような終了タグ表示します。

 carは引数のリストの最初の要素を返す関数です。cdrは引数のリストの最初の要素を取り除いたリストを返す関数です。displayは引数の値を表示する関数で、printと異なり改行は表示されません。

 次に、print-html-listについて解説します。

 これは、HTML要素の並び(リスト)の処理を行います。引数のリストが空でない場合は、最初のHTML要素をprint-htmlに渡し、1つの処理をしてもらいます。残りのリストは自分自身を呼び出すことで処理します。

 print-html-listはprint-html-listを再帰的に呼び出しています。Javaなどの言語では、再帰的な呼び出しはスタックを大量に消費するので避けられる傾向があります。Gauche(Scheme)では、このような再帰呼び出しはループに変換されて実行されるので心配なく使えます。

 null?は引数のリストが空なら真(#t)、空でなければ偽(#f)を戻す関数です。

 次に、print-open-tag、print-close-tagについて解説しましょう。これは、

や

のような開始タグ、終了タグ表示します。

 24~29行目は広域変数gauche-pageを定義し値としてS式で表したHTMLを代入しています。'(xxx ...)の先頭のシングルクオート「'」は構文糖で(quote (xxx...))の略記です、quote は(xxx...)を評価(計算)せずそのままを値とするスペシャルフォームです。

 31行目は、S式で表したHTML構造をprint-html関数に渡し、通常のHTMLに変換します。

 結果はGauche Web・・・のように1行で出力されますが、HTMLが正しく作られていることが分かると思います。

 print-html-listとprint-htmlはお互いを呼び出すことで再帰的に処理を行っていきます。データが入れ子(=再帰的)になっている場合は、処理するプログラムも再帰的に書くことでプログラムがシンプルになります。このような再帰的な呼び出しを使わずに繰り返しで処理しようとすると、かなり煩雑なプログラムになりますなることがあります。

まとめ

 今回はここまでです。Gauche(Lisp/Scheme)のプログラムは関数の集まりでとてもシンプルに短く書けることがお分かりいただけたでしょうか。またS式はさまざまなデータ構造を表現でき、それを処理するプログラムも再帰的呼び出しを使うことでシンプルに書けます。

 次回は、いよいよWebアプリらしいコードを書いていきたいと思います。

 最後に、記事の理解を深めるための書籍として、「プログラミングGauche(オライリージャパン刊)」、参考サイトとしてGauche(http://practical-scheme.net/gauche/index-j.html)、Gaucheプログラミング(立読み版)(http://karetta.jp/book-cover/gauche-hacks)を紹介します。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30