Elisp 続き

Emacs Lisp 側に select-module で指定されているモジュール名を渡す方法を考えよう。一度 Emacs 側でモジュール名が分かれば後はバッファローカル変数に設定すればいい。マクロ展開後に select-module が出てくる場合や、1ファイルに複数回 select-module を書いている場合はどうしようもないのであきらめる。

まず "(select-module " を探し、直後にポイントを移動したあとに read 関数で一つ分のS式を読む、という方法。現実的でだいたい上手くいくけど、"|" で囲まれた識別子の場合、内部に空白や()が入るのでうまくいかない。次に Elisp で正確に識別子を読むパーザーを作る方法。Elisp では再帰関数はあまり使えないのでエレガントには書けないし面倒。頭文字+後続文字、独特な識別子とか。調べたところ+ではじまる識別子もある。さらに Gauche は拡張されていて日本語のモジュール名も許すので注意。結局あきらめた。
頭を切り替えて Gauche 自身の read で読ませる方法を思いついた。なんだか循環しているような気もするし無駄に大仰だけど、これなら特殊なモジュール名だろうがひらがなのモジュールだろうが大丈夫。Scheme の骨格は以下のような感じ。

(call-with-input-file file
  (lambda (port)
    (let loop ((s (read port)))
      (if (not (eof-object? s))
          (match s
            (('select-module module)
             module)
            (_ (loop (read port))))))))

この場合、Emacs 側で、 comint-last-output-start と process-mark を使って gauche の出力から欲しいモジュール名だけを切り出せそう。


とりあえず続く。