main 手続きでコマンドライン引数を受け取れることを覚えたので、今度は引数(オプション)を処理するやり方を調べてみた。もちろん、Gauche にも用意されている。
cf. 9.19 gauche.parseopt – コマンドライン引数の解析 – Gauche ユーザリファレンス
この gauche.parseopt というモジュールは、Perl のコマンドライン処理にヒントを得たものらしい。とにかく例を見ながら書いてみた。
(use gauche.parseopt) (define greeting (lambda (name n morning) (let ((message (greeting-massage morning))) (let loop ((m n) (l '())) (if (= m 0) l (let ((msg (string-append message ", " name "!"))) (loop (- m 1) (cons msg l)))))))) (define greeting-massage (lambda (morning) (if morning "Good morning" "Hello"))) (define show-help (lambda (progname) (print (string-append "Usage: gosh " progname " [options] NAME")) (print "Options:") (print " -m --morning Good morning.") (print " -t --times=N N times greeting.") (print " -h --help Show this message.") (exit))) (define main (lambda (args) (let-args (cdr args) ((morning "m|morning") (times "t|times=i" 1) (help "h|help" => (cut show-help (car args))) . restargs ) (for-each print (greeting (car restargs) times morning)))))
いろいろ書いているけど、キモは33~38行目の let-args だ。ここで、スクリプトの受け付けるオプションを定義している。基本形は (morning "m|morning")
。m が短いオプション名で morning が長いオプション名。-m オプションが指定されると #t に変数 morning が束縛される。
オプションは引数をとることもできる。”t|times=i” という書き方は -t(–times)オプションが整数を引数に取ることを指示している。と同時に、1 とあるのはオプションが指定されなかったときのデフォルト値だ。
-h(–help)オプションはコールバック関数を呼び出す。(cut ...)
というのは例をまねただけなのでよくわからない(あとで調べてみよう)けど、これでヘルプを表示する show-help 関数を呼び出せるようだ。
で、オプションとして解析されなかった残りのコマンドライン引数は、restargs に束縛される。
それじゃ、うまく動くか試してみよう。
^o^ > gosh greeting.scm --help Usage: gosh greeting.scm [options] NAME Options: -m --morning Good morning. -t --times=N N times greeting. -h --help Show this message. ^o^ > gosh greeting.scm Andy Hello, Andy! ^o^ > gosh greeting.scm --morning Andy Good morning, Andy! ^o^ > gosh greeting.scm --morning --times 3 Andy Good morning, Andy! Good morning, Andy! Good morning, Andy!
うまくいったようだ。
もっと詳しくはリファレンスマニュアルで。