emacs



4. Emacs のすすめ

Scheme のプログラム編集を補助してくれるモードのあるエディタで代表的なのは Emacs です.Emacs はそれ自身が Emacs-Lisp という Lisp のインタープリタに なっているくらいですから,Scheme のプログラミングをするときには最適です.

Gauche でプログラミングをするときには,

  1. Editor で Gauche のプログラムコードを作成
  2. Gauche の関数の使い方を調査
  3. Gauche のインタープリタの対話モードで動作確認

を繰り返すことになります.これを支援してくれる Emacs のモードがありますので それを使わない手はありません。最近の Emacs 21 では、cmuscheme.el が標準で インストールされているはずですので次のようなおまじないをします。

4.1. おまじない

.emacs に以下の設定をおまじないとして入れておきましょう.

(setq scheme-program-name "gosh")
(require 'cmuscheme)

(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 のプログラムファイルを作成してみましょう。 コマンドプロンプトから、

$ emacs fact.scm

と入力して、fact.scm という名前でファイルを新規に編集してみましょう。 Emacs のステータスバーのモードの表示のとろに Scheme の表示が出ましたか? これが出ていれば、Scheme モードになっていますので、便利な機能が使えます。

ここでは fact という関数を定義してみます。

(define (fact n_

と入力してから(ここでは、「_」カーソルの位置を表わしていいます、これは 入力しません)、閉じ括弧(「コッカ」と呼びます)を入力してみましょう。 一瞬だけ、対応する開き括弧(単に「カッコ」というとこちらを指します)の位置に カーソルが移動しましたね。Emacs の Scheme モードのこの機能はたいへん便利です。 この機能のないエディタで Scheme のプログラミングをするのは辛いです。

(define (fact n)_

さらに、改行キーを押してみましょう。改行後、tabキーを押すか、C-i を 押してみましょう。そうすると、カーソルは

(define (fact n)
  _

のようにインデントされて、前の行の最初の「e」の真下に来ます。 さらに続けて、入力して fact の定義を完成しましょう。

(define (fact n)
  (if (= n 0)
      1
      (* n (fact (- n 1)))))_

改行し、tab を押すたびに適切なインデント位置にカーソルが来るのが わかるでしょう。これも Emacs の scheme モードの便利なところです。 定義の最後に「コッカ」がたくさんならびましたが、入力の度に、対応する 「カッコ」にカーソルが飛ぶので、それを見ながら、最後に define の前の 「カッコ」にカーソルが飛んだらおしまいです。

関数がひとつだけとはいえ、これもりっぱなプログラムです。大事なプログラム を失うことのないように、まずは、C-xC-s でセーブしましょう。

4.2. カーソル移動

さて、.emacs のおまじないはどのように効くのでしょう。 まず、カーソルの移動用の以下のような便利なキー操作が使えます。

M-C Space カーソルの次のS式をマーク
M-C-a カーソルを含むトップレベルのS式の先頭へ移動
M-C-e カーソルを含むトップレベルのS式の末尾へ移動
M-C-f 次のS式へ移動
M-C-b 前のS式へ移動
M-C-t カーソルの前後のS式を交換
M-C-d 1レベル内側のS式へ移動
M-C-u 1レベル外側のS式へ移動

これらのキー操作はおぼえておくと便利です。

4.3. ファイルのロードおよびS式の評価

C-cS とタイプしてみましょう。Emacs の画面が2分割されて、Gauche の インタープリタのプロンプトが表示された(Emacsの)ウィンドウが表示されま したね。これで、インタープリタの準備ができました。

そこで、fact.scm のバッファへ戻って、C-cC-l とやってみましょう。 すると、ミニバッファに Load Scheme file: というプロンプトがあらわれて インタープリタにロードするファイルを尋ねられます。そのままリターンキーを 押すとインタープリタ側のバッファに #t が出ます。これで、インタープリタに 先程のプログラムが読みこまれました。試してみましょう。インタープリタに (fact 5) を評価させてみましょう。インタープリタ側にもどって、インタープリタ のプロンプト gosh> のあとに (fact 5) と書いてリターンキーを押してみましょう。

gosh> (fact 5)
120

のようになりましたか?

では再び、fact.scm バッファに戻って、さっきのプログラムの後に、

;; (fact 6)
;; (fact 10)

という2行を追加して下さい。そうしてから、(fact 6) の直後にカーソルを 置いて、C-xC-e を押してみてください。インタープリタ側(*scheme*バッファ) に 720 が表示されましたか?

次に (fact 10) の直後にカーソルを置いて同じことをやってみましょう。 *scheme* バッファに 362800 が表示されたでしょう。

Gauche のプログラミングでは、こんな風に Emacs を使いながら、自分の 定義した関数のうごきをチェックしながら進めます。

Powered by Kahua