多くのオペレーティング システムでは、プログラムに文字列の引数を渡して起動することができる (argv と呼ばれる配列に、プログラム名に続いてその引数が渡されることが多い)。 ほとんどのプログラムでは、この文字列引数を解析して処理する必要がある。 この SRFI では、POSIX と GNU C Library Reference Manual のガイドラインに従うプログラム引数を処理するための手続きを定義する。
プログラム引数は多くのプログラムにおいて主要なインターフェイスであるので、 引数の処理はプログラミングの一般的なタスクである。 このタスクを実行するには多くの方法がある (それらの方法はしばしば競合する) ので、自前の処理ルーチンが必要になることがよくある。 しかし、多くのプログラマ (とそのユーザー) は 共通のガイドラインに従った簡便なインターフェイスを望んでいる。
POSIX はプログラムのオプション、オプション引数、オペランドを指定するためのいくつかの ガイドライン を定めており、 これらのガイドラインに対する歴史的な例外についても言及している。 GNU C Library Reference Manual は POSIX ガイドラインを拡張した長いオプションを 定めている。
この SRFI では、上記のガイドラインに従うプログラムを作成するために、以下の処理を行う手続きを定義する。
この手続きの実験的なバージョンは、すでにいくつかの Scheme 処理系において実装されている。 Chicken 用の実装はここ、 Scsh 用の実装はここにある。
args-fold は SRFI 1 の fold 手続き (「基本的なリスト イテレータ」) と類似している。 この手続きはオプションとオペランドを解析するたびに、 対応するオペランド処理手続きやオプション処理手続きを呼び出す。 map 手続きとは異なり、fold 手続きはシードと呼ばれる状態を、処理手続きごとに伝達することができる。
たとえば、あるプログラムで、オペランドのリストとオプションのテーブルを作成したいとしよう。 これを作成するには、 args-fold のシードとして空のオペランド リストと空のオプション テーブルを渡せばよいだろう。 オペランド処理手続きはオペランド リストにオペランドを追加し、 オプション処理手続きはオプション テーブルにオプションを追加すればよい。 --version や --help のようなオプションが現れたときには、 すぐに相応のアクションを取ることもできる。 プログラム引数の処理には、このような異種混合な処理が適している。 fold のような処理方式であれば、望むなら関数型の実装にもできる。
procedure prototype: (option-processor OPTION NAME ARG SEEDS ...)
これはオプション処理手続きのプロトタイプである。 この手続きは次のシードを返さなければならない。 OPTION にはオプションが渡される。 NAME には args-fold が解析した OPTION のオプション名の1つが渡される。 ARG にはオプション引数の文字列が渡される。 オプション引数が指定されていない場合は #f が渡される。
procedure prototype: (operand-processor OPERAND SEEDS ...)
これはオペランド処理手続きのプロトタイプである。 この手続きは次のシードを返さなければならない。 OPERAND には文字列が渡される。
procedure: (option NAMES REQUIRED-ARG? OPTIONAL-ARG? OPTION-PROC)
オプションを返す。 NAMES は短いオプション (文字) と長いオプション (文字列) の名前のリストである。 REQUIRED-ARG? はこのオプションがオプション引数を必要とするかどうかを指定する (ブール値)。 OPTION-PROC はオプション処理手続きのプロトタイプに従う手続きであり、 このオプションを処理するために使用される。
procedure: (option-names OPTION) procedure: (option-required-arg? OPTION) procedure: (option-optional-arg? OPTION) procedure: (option-processor OPTION)
OPTION のフィールドの内容を返す。
procedure: (args-fold ARGS OPTIONS UNRECOGNIZED-OPTION-PROC OPERAND-PROC SEEDS ...)
引数文字列のリストを左から右に解析し、 解析された既知のオプション、未知のオプション、オペランドに対して、 適切な処理手続きを順番に呼び出す。 シード値を処理手続きごとに受け渡していき、最後のシード値が戻り値として返される。 ARGS は文字列のリストである。 OPTIONS はオプションのリストである。 UNRECOGNIZED-OPTION-PROC はオプション処理手続きのプロトタイプに従う手続きであり、 認識できないオプションを処理するために使用される。 ノート: args-fold は UNRECOGNIZED-OPTION-PROC を呼び出すために必要に応じて一時的なオプションを作成する。 OPERAND-PROC はオペランド処理手続きのプロトタイプに従う手続きであり、 オペランドを処理するために使用される。
参照実装のソースはこちら。Copyright (C) Anthony Carrico (2002). All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.