gaucheにおけるオプション解析

コマンドにおけるオプションとは

 コマンドにおけるオプションとは、ある実行させたいコマンドに、細かな指示を与えるものです。たとえばcatコマンドなら


cat -n filename
とすることによって、各行の先頭に行数を表示することができます。

オプションの解析

 このように、コマンドにオプションを付けることによって、コマンドの動作を柔軟に変えることことができ、大変便利になります。
 今度は、オプションを与えられたコマンド側になって考えてみます。オプションを与えられたコマンドは、

  • あらかじめ規程したオプションのうち、何が指定されているか
  • どのような順番でオプションを指定されたか
  • オプションの引数の引数はどれか

などを考慮して、実行しなければなりません。ここでコマンドを作る各個人が、バラバラな形式のオプションを規程すると、コマンドを使う人たちはたちまち混乱してしまうでしょう。コマンドを作る側の人は、どのようなオプションの形式を作り、それを解析するかに毎回頭を悩ませなければなりません。そこで、ある程度オプションの形式が一貫していた方がなにかと便利です。このように考える人はたくさんいたようで今では、IEEEのPOSIXや、GNUでオプションの形式について標準化されています。少し例をだすと、

  • オプションとしての引数の最初の文字はハイフン’-’で始める。
  • 複数のオプションを指定する際に、オプション自体の引数をとるオプションがなければ一つのハイフン’-’で、一つの語句(トークン)とすることができる。
Argument Syntax (The GNU C Library)

などがあります。

gaucheでのオプション解析

 gaucheで、既に用意されているオプション解析の方法として、これらの3つの方法があるようです。

  • gauche.parseoptライブラリモジュールを使う
  • srfi-37ライブラリモジュールを使う
  • slibのgetoptモジュールを使う
gauche.parseoptライブラリモジュール

 使ってみた感想としては、これが一番使いやすいと感じました。公式リファレンスで使用例が載っていますので、使用例はそちらを参照してください。ほとんどの場合、このモジュールで事が足りてしまうのではないかと思いますが、

C における典型的な getopt や getopt_long の実装とは異なり、 let-args は与えられたコマンドライン引数の順番を変えません。オプションでない引数(ハイフンで始まらない引数)に遭遇した時点でパースを中止します。
パーサは、ハイフン2つのみの引数 `--' に遭遇すると、引数パーシングを中止して`--' の後の引数のリストを返します。

Gauche Users’ Reference: Top

という仕様に、作成するコマンドの仕様が合わない場合は、他の2つの方法を使うか、自分で引数解析のコードを書くなどすれば良いかと思います。

srfi-37ライブラリ

 このライブラリは、

ロングオプションを含む、POSIX および GNU の getopt のガイドラインに準拠しています。

Gauche Users’ Reference: Top

ということらしいです。公開用など、厳密にオプションの形式にしたい場合などにこのライブラリが使えると思います。しかし、結構使い方が複雑で使いこなすには少し時間がかかりそうです。

slibのgetoptモジュール

 このモジュールは、どうやらCのgetopt関数をschemeに移植したものであるようです。POSIXのオプション形式に対応しているようです。Cのgetopt関数に慣れている人は、このモジュールが使いやすいかもしれません。


 個人的にはなにか特別な理由がない限り、gauche.parseoptライブラリモジュールを使ってコマンドを作っていきたいと思います。


 次回は、catコマンドに簡単なオプションを付けてみたいと思います。