連載
» 2008年12月17日 00時00分 UPDATE

Gaucheでメタプログラミング(2):Gaucheでプログラミング (3/4)

[吉田裕美,有限会社イーワイオフィス]

Emacsを使う

 皆さんは、どんなエディタをお使いでしょうか。UNIX系のエディタとしては、vi(vim)派とEmacs派が大多数だと思います。Emacsは、Emacs Lisp処理系とエディタの基本機能をC言語で実装したベースのうえに、Emacs Lispで構築されたエディタということもありLispとは大変に相性が良いです。私も長年Emacsを利用しています。

 Emacsは一般的なエディタ機能だけでも強力ですが、編集するプログラム言語ごとにその言語固有の編集機能をモードという形でサポートしています。

 Scheme用にはSchemeモードがあり、通常.scmで終わるファイルを読み込んだ場合はSchemeモードになります。SchemeモードはEmacsインストールパッケージに含まれているので最初から使えます。

 GaucheはSchemeの一実装ですので、Schemeモードだけでもプログラミングできますが、Gauche用にカスタマイズした方がより便利になります。

 私は、あまりEmacsの設定ファイルにはこだわらない方なので、書籍「プログラミングGauche」に書かれた設定をそのまま使っています。この設定はKaretta|Gaucheプログラミング(立読み版)|Emacsの設定に公開されています。

 設定はホームディレクトリーの.emacsファイルに書きます。この設定の一部を説明すると、

1. goshに渡す文字コードをUTF-8に設定

(setq process-coding-system-alist
      (cons '("gosh" utf-8 . utf-8) process-coding-system-alist))

2. Emacsのバッファ内で動かすScheme処理系を/usr/local/bin/goshに設定

(setq scheme-program-name "/usr/local/bin/gosh -i")

3. Schemeモードをより便利なcmuscheme.elで使用する設定

(autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t)
(autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t)

4. ウィンドウを2つに分け、一方でgoshインタプリタを実行する関数(コマンド)を定義し、Ctrl+C、S(Ctrl+Cの次にS)で起動できるように設定

(defun scheme-other-window ()
  "Run scheme on other window"
  (interactive)
  (switch-to-buffer-other-window
   (get-buffer-create "*scheme*"))
  (run-scheme scheme-program-name))
(define-key global-map
  "\C-cS" 'scheme-other-window)

となっています。

Schemeモードを試す

 この設定を使うと、下図のようにCtrl+C、Sで下のウィンドウでgoshを動かし、上のウィンドウに書いたGaucheのプログラムを実行できます。上のウィンドウの(defineから始まるプログラムは階乗を計算するfact関数を定義しています。

画面 Schemeモード

 この関数を書く際には、TABキーでEmacsが適宜インデントを調整してくれます。また、カーソルを閉じカッコの次に移動すると対応する開きカッコが青バックになりカッコの対応を確認できます。

 fact関数の定義ができたら最後の閉じカッコの次にカーソルを移動し、Ctrl+X、Ctrl+Eとキーインすると、下のgoshウィンドウでカーソルの直前のS式が実行され、fact関数が定義されます。たくさんのS式(関数定義など)を実行するには、実行したいS式を選択し、Ctrl+C、Ctrl+Rで選択したS式をすべて実行できます。

 その後、下のウィンドウにカーソルを移動し、(fact 10)のように入力することでfact関数の実行を試せます。また、goshウィンドウでメタP(MetaまたはALTキーとPを同時に押す)とキーインすると以前入力した行が表示され再利用できます。

 このように、上のウィンドウで関数を作っては下のウィンドウで確認しながら、効率よくGaucheのプログラムを作っていけます。

Gaucheのドキュメントを読もう

 実際にプログラミングする際には、その言語の文法や考え方だけではなく、ライブラリ(API)群を知ることが重要です。例えば、Javaの文法、オブジェクト指向などを完ぺきに理解していても、J2SEのAPI仕様を知らなければ現実的なプログラミングはおぼつかないと思います。

 素晴らしいことに、Gaucheには日本語で読める良質のユーザーリファレンスがあります。

関連リンク:

Gauche ユーザリファレンス
http://practical-scheme.net/gauche/man/gauche-refj.html


 まずは、4章「基本的な構文」、6章「組み込みライブラリ」を一読することをお勧めします。途中で分からない部分が出てきたら飛ばしてよいので、どこにどんなことが書かれているかというイメージをつかんでください。

 5章「マクロ」、7章「オブジェクトシステム」はGaucheの面白いところであり、この連載でも取り上げます。しかし、Lisp系の言語が初めての方には分かりにくいかもしれないので読み飛ばしても結構です。

 9章「ライブラリモジュール - Gauche拡張モジュール」、10章「ライブラリモジュール - SRFI」、11章「ライブラリモジュール - ユーティリティ」はライブラリのリファレンスなので、どんな関数があるのかというイメージをつかんでください。

 ちなみに、SRFI(サーフィ)というのはScheme Requests for Implementationの略で、Schemeの実質的な標準ライブラリの仕様です。Schemeの言語仕様はR5RS(Revised5 Report on the Algorithmic Language Scheme)、R6RS(Revised6 Report on the Algorithmic Language Scheme)などで規定されていますが、これらはコアな部分のみで、実用的なライブラリ群は規定されていません。

 GaucheはR5RS規格のScheme処理系ですが、いくつかの独自拡張部分を持っています。

 Gaucheのライブラリはかなり充実しています。実際にプログラミングする際には自分が考えているプログラムで使えそうな関数がないかリファレンスを探したり、仕様を確認したりする機会が多くなります。

 そこで、ドキュメント類は、http://practical-scheme.net/vault/gauche-refj.tgzをダウンロードしてローカル環境に置いておくことをお勧めします。

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。