SRFI-37はargs-fold: プログラム引数処理器です。 何をするかといえば、プログラムに渡された引数をいい感じに処理してくれます。使い方は以下。
(import (rnrs) (srfi :37)) (define options (list (option '(#\l "long-display") #f #f (lambda (option name arg seed1 seed2) (values (cons 'l seed1) seed2))) (option '(#\o "output-file") #t #f (lambda (option name arg seed1 seed2) (values (acons 'o arg seed1) seed2))) (option '(#\d "debug") #f #t (lambda (option name arg seed1 seed2) (values (acons 'd arg seed1) seed2))) (option '(#\b "batch") #f #f (lambda (option name arg seed1 seed2) (values (cons 'b seed1) seed2))) (option '(#\i "interactive") #f #f (lambda (option name arg seed1 seed2) (values (cons 'i seed1) seed2))))) (let-values (((opts operands) (args-fold (command-line) options (lambda (option name arg seed1 seed2) (values (acons '? name seed1) seed2)) (lambda (arg seed1 seed2) (values seed1 (cons arg seed2))) '() '()))) (write opts) (newline) (write operands) (newline))上記を例えば以下のように実行すると、
% sash test.scm -l --output-file=a.out -d the rest of argumentこんな感じの出力が得られます。
((d . #f) (o . "a.out") l) ("argument" "of" "rest" "the" "test.scm")このSRFIはかなり柔軟に作られていて、引数の順番は定義順である必要がありません。また、短いオプションではスペースを挟んでも挟まなくてもよく、長いオプションでは
=
の変わりにスペースが使えます。肝になる点は以下の3点です。
option
手続きによる引数が何をとるかの指定args-fold
の第3引数の定義外オプションの扱い手続きargs-fold
の第4引数のオプション以外の引数の扱い
args-fold
という名の通り引数を畳み込んでいくイメージで使います。正直このままでは使いにくいなぁと思ったので、Sagittariusではこれを薄いマクロで包んだ
(getopt)
というライブラリを提供しています。今回はSRF-37を紹介しました。
No comments:
Post a Comment