123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368 |
- @c -*-texinfo-*-
- @c This is part of the GNU Guile Reference Manual.
- @c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2011
- @c Free Software Foundation, Inc.
- @c See the file guile.texi for copying conditions.
- @node getopt-long
- @section The (ice-9 getopt-long) Module
- The @code{(ice-9 getopt-long)} facility is designed to help parse
- arguments that are passed to Guile programs on the command line, and is
- modelled after the C library's facility of the same name
- (@pxref{Getopt,,,libc,The GNU C Library Reference Manual}). For a more
- low-level interface to command-line argument parsing, @xref{SRFI-37}.
- The @code{(ice-9 getopt-long)} module exports two procedures:
- @code{getopt-long} and @code{option-ref}.
- @itemize @bullet
- @item
- @code{getopt-long} takes a list of strings --- the command line
- arguments --- an @dfn{option specification}, and some optional keyword
- parameters. It parses the command line arguments according to the
- option specification and keyword parameters, and returns a data
- structure that encapsulates the results of the parsing.
- @item
- @code{option-ref} then takes the parsed data structure and a specific
- option's name, and returns information about that option in particular.
- @end itemize
- To make these procedures available to your Guile script, include the
- expression @code{(use-modules (ice-9 getopt-long))} somewhere near the
- top, before the first usage of @code{getopt-long} or @code{option-ref}.
- @menu
- * getopt-long Example:: A short getopt-long example.
- * Option Specification:: How to write an option specification.
- * Command Line Format:: The expected command line format.
- * getopt-long Reference:: Full documentation for @code{getopt-long}.
- * option-ref Reference:: Full documentation for @code{option-ref}.
- @end menu
- @node getopt-long Example
- @subsection A Short getopt-long Example
- This section illustrates how @code{getopt-long} is used by presenting
- and dissecting a simple example. The first thing that we need is an
- @dfn{option specification} that tells @code{getopt-long} how to parse
- the command line. This specification is an association list with the
- long option name as the key. Here is how such a specification might
- look:
- @lisp
- (define option-spec
- '((version (single-char #\v) (value #f))
- (help (single-char #\h) (value #f))))
- @end lisp
- This alist tells @code{getopt-long} that it should accept two long
- options, called @emph{version} and @emph{help}, and that these options
- can also be selected by the single-letter abbreviations @emph{v} and
- @emph{h}, respectively. The @code{(value #f)} clauses indicate that
- neither of the options accepts a value.
- With this specification we can use @code{getopt-long} to parse a given
- command line:
- @lisp
- (define options (getopt-long (command-line) option-spec))
- @end lisp
- After this call, @code{options} contains the parsed command line and is
- ready to be examined by @code{option-ref}. @code{option-ref} is called
- like this:
- @lisp
- (option-ref options 'help #f)
- @end lisp
- @noindent
- It expects the parsed command line, a symbol indicating the option to
- examine, and a default value. The default value is returned if the
- option was not present in the command line, or if the option was present
- but without a value; otherwise the value from the command line is
- returned. Usually @code{option-ref} is called once for each possible
- option that a script supports.
- The following example shows a main program which puts all this together
- to parse its command line and figure out what the user wanted.
- @lisp
- (define (main args)
- (let* ((option-spec '((version (single-char #\v) (value #f))
- (help (single-char #\h) (value #f))))
- (options (getopt-long args option-spec))
- (help-wanted (option-ref options 'help #f))
- (version-wanted (option-ref options 'version #f)))
- (if (or version-wanted help-wanted)
- (begin
- (if version-wanted
- (display "getopt-long-example version 0.3\n"))
- (if help-wanted
- (display "\
- getopt-long-example [options]
- -v, --version Display version
- -h, --help Display this help
- ")))
- (begin
- (display "Hello, World!") (newline)))))
- @end lisp
- @node Option Specification
- @subsection How to Write an Option Specification
- An option specification is an association list (@pxref{Association
- Lists}) with one list element for each supported option. The key of each
- list element is a symbol that names the option, while the value is a
- list of option properties:
- @lisp
- OPTION-SPEC ::= '( (OPT-NAME1 (PROP-NAME PROP-VALUE) @dots{})
- (OPT-NAME2 (PROP-NAME PROP-VALUE) @dots{})
- (OPT-NAME3 (PROP-NAME PROP-VALUE) @dots{})
- @dots{}
- )
- @end lisp
- Each @var{opt-name} specifies the long option name for that option. For
- example, a list element with @var{opt-name} @code{background} specifies
- an option that can be specified on the command line using the long
- option @code{--background}. Further information about the option ---
- whether it takes a value, whether it is required to be present in the
- command line, and so on --- is specified by the option properties.
- In the example of the preceding section, we already saw that a long
- option name can have a equivalent @dfn{short option} character. The
- equivalent short option character can be set for an option by specifying
- a @code{single-char} property in that option's property list. For
- example, a list element like @code{'(output (single-char #\o) @dots{})}
- specifies an option with long name @code{--output} that can also be
- specified by the equivalent short name @code{-o}.
- The @code{value} property specifies whether an option requires or
- accepts a value. If the @code{value} property is set to @code{#t}, the
- option requires a value: @code{getopt-long} will signal an error if the
- option name is present without a corresponding value. If set to
- @code{#f}, the option does not take a value; in this case, a non-option
- word that follows the option name in the command line will be treated as
- a non-option argument. If set to the symbol @code{optional}, the option
- accepts a value but does not require one: a non-option word that follows
- the option name in the command line will be interpreted as that option's
- value. If the option name for an option with @code{'(value optional)}
- is immediately followed in the command line by @emph{another} option
- name, the value for the first option is implicitly @code{#t}.
- The @code{required?} property indicates whether an option is required to
- be present in the command line. If the @code{required?} property is
- set to @code{#t}, @code{getopt-long} will signal an error if the option
- is not specified.
- Finally, the @code{predicate} property can be used to constrain the
- possible values of an option. If used, the @code{predicate} property
- should be set to a procedure that takes one argument --- the proposed
- option value as a string --- and returns either @code{#t} or @code{#f}
- according as the proposed value is or is not acceptable. If the
- predicate procedure returns @code{#f}, @code{getopt-long} will signal an
- error.
- By default, options do not have single-character equivalents, are not
- required, and do not take values. Where the list element for an option
- includes a @code{value} property but no @code{predicate} property, the
- option values are unconstrained.
- @node Command Line Format
- @subsection Expected Command Line Format
- In order for @code{getopt-long} to correctly parse a command line, that
- command line must conform to a standard set of rules for how command
- line options are specified. This section explains what those rules
- are.
- @code{getopt-long} splits a given command line into several pieces. All
- elements of the argument list are classified to be either options or
- normal arguments. Options consist of two dashes and an option name
- (so-called @dfn{long} options), or of one dash followed by a single
- letter (@dfn{short} options).
- Options can behave as switches, when they are given without a value, or
- they can be used to pass a value to the program. The value for an
- option may be specified using an equals sign, or else is simply the next
- word in the command line, so the following two invocations are
- equivalent:
- @example
- $ ./foo.scm --output=bar.txt
- $ ./foo.scm --output bar.txt
- @end example
- Short options can be used instead of their long equivalents and can be
- grouped together after a single dash. For example, the following
- commands are equivalent.
- @example
- $ ./foo.scm --version --help
- $ ./foo.scm -v --help
- $ ./foo.scm -vh
- @end example
- If an option requires a value, it can only be grouped together with other
- short options if it is the last option in the group; the value is the
- next argument. So, for example, with the following option
- specification ---
- @lisp
- ((apples (single-char #\a))
- (blimps (single-char #\b) (value #t))
- (catalexis (single-char #\c) (value #t)))
- @end lisp
- @noindent
- --- the following command lines would all be acceptable:
- @example
- $ ./foo.scm -a -b bang -c couth
- $ ./foo.scm -ab bang -c couth
- $ ./foo.scm -ac couth -b bang
- @end example
- But the next command line is an error, because @code{-b} is not the last
- option in its combination, and because a group of short options cannot
- include two options that both require values:
- @example
- $ ./foo.scm -abc couth bang
- @end example
- If an option's value is optional, @code{getopt-long} decides whether the
- option has a value by looking at what follows it in the argument list.
- If the next element is a string, and it does not appear to be an option
- itself, then that string is the option's value.
- If the option @code{--} appears in the argument list, argument parsing
- stops there and subsequent arguments are returned as ordinary arguments,
- even if they resemble options. So, with the command line
- @example
- $ ./foo.scm --apples "Granny Smith" -- --blimp Goodyear
- @end example
- @noindent
- @code{getopt-long} will recognize the @code{--apples} option as having
- the value "Granny Smith", but will not treat @code{--blimp} as an
- option. The strings @code{--blimp} and @code{Goodyear} will be returned
- as ordinary argument strings.
- @node getopt-long Reference
- @subsection Reference Documentation for @code{getopt-long}
- @deffn {Scheme Procedure} getopt-long args grammar [#:stop-at-first-non-option #t]
- Parse the command line given in @var{args} (which must be a list of
- strings) according to the option specification @var{grammar}.
- The @var{grammar} argument is expected to be a list of this form:
- @code{((@var{option} (@var{property} @var{value}) @dots{}) @dots{})}
- where each @var{option} is a symbol denoting the long option, but
- without the two leading dashes (e.g.@: @code{version} if the option is
- called @code{--version}).
- For each option, there may be list of arbitrarily many property/value
- pairs. The order of the pairs is not important, but every property may
- only appear once in the property list. The following table lists the
- possible properties:
- @table @asis
- @item @code{(single-char @var{char})}
- Accept @code{-@var{char}} as a single-character equivalent to
- @code{--@var{option}}. This is how to specify traditional Unix-style
- flags.
- @item @code{(required? @var{bool})}
- If @var{bool} is true, the option is required. @code{getopt-long} will
- raise an error if it is not found in @var{args}.
- @item @code{(value @var{bool})}
- If @var{bool} is @code{#t}, the option accepts a value; if it is
- @code{#f}, it does not; and if it is the symbol @code{optional}, the
- option may appear in @var{args} with or without a value.
- @item @code{(predicate @var{func})}
- If the option accepts a value (i.e.@: you specified @code{(value #t)} for
- this option), then @code{getopt-long} will apply @var{func} to the
- value, and throw an exception if it returns @code{#f}. @var{func}
- should be a procedure which accepts a string and returns a boolean
- value; you may need to use quasiquotes to get it into @var{grammar}.
- @end table
- The @code{#:stop-at-first-non-option} keyword, if specified with any
- true value, tells @code{getopt-long} to stop when it gets to the first
- non-option in the command line. That is, at the first word which is
- neither an option itself, nor the value of an option. Everything in the
- command line from that word onwards will be returned as non-option
- arguments.
- @end deffn
- @code{getopt-long}'s @var{args} parameter is expected to be a list of
- strings like the one returned by @code{command-line}, with the first
- element being the name of the command. Therefore @code{getopt-long}
- ignores the first element in @var{args} and starts argument
- interpretation with the second element.
- @code{getopt-long} signals an error if any of the following conditions
- hold.
- @itemize @bullet
- @item
- The option grammar has an invalid syntax.
- @item
- One of the options in the argument list was not specified by the
- grammar.
- @item
- A required option is omitted.
- @item
- An option which requires an argument did not get one.
- @item
- An option that doesn't accept an argument does get one (this can only
- happen using the long option @code{--opt=@var{value}} syntax).
- @item
- An option predicate fails.
- @end itemize
- @code{#:stop-at-first-non-option} is useful for command line invocations
- like @code{guild [--help | --version] [script [script-options]]}
- and @code{cvs [general-options] command [command-options]}, where there
- are options at two levels: some generic and understood by the outer
- command, and some that are specific to the particular script or command
- being invoked. To use @code{getopt-long} in such cases, you would call
- it twice: firstly with @code{#:stop-at-first-non-option #t}, so as to
- parse any generic options and identify the wanted script or sub-command;
- secondly, and after trimming off the initial generic command words, with
- a script- or sub-command-specific option grammar, so as to process those
- specific options.
- @node option-ref Reference
- @subsection Reference Documentation for @code{option-ref}
- @deffn {Scheme Procedure} option-ref options key default
- Search @var{options} for a command line option named @var{key} and
- return its value, if found. If the option has no value, but was given,
- return @code{#t}. If the option was not given, return @var{default}.
- @var{options} must be the result of a call to @code{getopt-long}.
- @end deffn
- @code{option-ref} always succeeds, either by returning the requested
- option value from the command line, or the default value.
- The special key @code{'()} can be used to get a list of all
- non-option arguments.
|