isi

石崎と申します。

じじいです(ほんとに)。昔、ミニコン(死語?)のSEをやってました。 趣味でschemeを触っております。仕事ではほとんどschemeとの関係がないんですけど、つい最近ちょっとだけgaucheのsxml.sxpathにお世話になりました。(2006/02/13 07:11:00 PST)


Readline パッケージについて

ここGauche:対話環境での入出力が発端です。gaucheでのreadlineの実装をちょっと使ってみましたので、報告します。
環境は、Mac OS X 10.3.9 + Gauche 0.8.6 + GNU Readline 4.3-26 です。

Gauche-readline

YOKOTA Hiroshiさんが開発しているGauche用GNU Readline拡張モジュール。入力テキストの履歴機能、関数名等の補完機能あり。gosh-rlという対話モード用スクリプトが付属している。

  1. Makefileの変更
    GNU Readlineをfinkでインストールしていた関係から、Makefileに-I /sw/include, -L /sw/lib を追加。また、共有ライブラリのリンケージのスイッチを -shared から -bundle に変更。
  2. make
  3. sudo make install

以上で完了、対話モード用スクリプトもインストールされるので、gosh-rl とたたけばすぐ使用可能。TerminalでのReadline機能と履歴機能は便利ですね。1行に複数のS式や複数行にまたがるS式の入力も問題無し。先頭のS式が複数行にまたがる場合は、次のようになります。...がプロンプトで表示されます。(実は、しばらく前のバージョンを試したことがあって、その時はこの...もgosh>と表示されたので、ちょっと使いずらいなあと思っていたのでした)

 bash$ gosh-rl
 gosh> (+ 1 2 3 4 5
 ... 6 7 8
 ... 9 10)
 55
 gosh>

Scheme Terminal Library 0.3

Gauche:Packagesにfindとgauche-ircが登録されていますが、このサイト http://www.synthcode.com/ で公開されているVT100制御、Readline機能等をサポートするパッケージ。全てscheme codeで実装されているため、Readline機能を使う際にGNU Readline等は不要。入力テキストの履歴機能、関数名等の補完機能あり。igoshという対話モード用スクリプトが付属している。

  1. ダウンロード
    igoshを動かすには上記サイトより、次の3つのファイルをダウンロードする。
    • Scheme Terminal Library 0.3 [scheme-term-0.3.tar.bz2]
    • util.history 0.1 [history.scm]
    • text.format 0.1 [format.scm]
  2. 修正
    以下の4つのファイルを修正する必要がありました。
    • scheme-term/bin/igosh
      例外発生時のスタック・ダンプを vm-get-stack-trace と debug-print-stack を使って実現しているが Gauche 0.8.6 では動かないようなので、report-error を使う方法に変更。これは Gauche-devel-jp のアーカイブを参照しました。
    • scheme-term/term/line.scm
      (use srfi-1) を追加する。
    • scheme-term/term/stty.scm
      gauche.termios の各種パラメータを参照しているのであるが、これらのパラメータは環境依存のようである(termios.h)。リリース・ファイルが作成された環境と Mac OS X では異なっているようで、存在しないパラメータの参照が幾つか発生した。そこのところをコメント・アウトする。Gauche-0.8.6/ext/termios/test.scm が参考になる。
    • history.scm
      (use srfi-1) を追加する。
  3. インストール
    Makefile があり make install ができるようになっているが、内容は install コマンドによる term/*.scm のコピーだけなのと、ディレクトリ名が間違っているのと、install が Mac OS X のものとはちょっと違っているようなので、使わなかった。
    各ソースはモジュールなので gauche の *load-path* にあるディレクトリに以下のような構造でコピーすればよい。
    • scheme-term/term/*.scm --> term/*.scm
    • history.scm --> util/history.scm
    • format.scm --> text/format.scm

以上で完了。igosh はパスの通った適当なところに置いておく。igosh は入力したテキストの先頭のS式のみを処理するようです。先頭のS式の後ろのテキストは単純に捨てられる。複数行にわたるS式の入力は問題無し。こんな感じです。

 bash$ igosh
 gosh> (+ 1 2 3)  (foo bar
 6
 gosh> (+ 1 2 3 4 5
 6 7 8
 9 10)
 55
 gosh>

2つほど不具合に遭遇しました。(1)関数名の補完ができるのだけど、補完対象にない文字列を入力して補完させるとエラーとなる。(2)Mac OS X の Terminal で、カーソルが最下行にあるときの履歴表示で表示が乱れる。

もし日々利用するような事を考えるのならば、Gauche-readline がお勧めだと思います。2006/02/22 05:43:14 PST

More ...