DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH
 

(guile.info.gz) lambda* Reference

Info Catalog (guile.info.gz) let-keywords Reference (guile.info.gz) Optional Arguments (guile.info.gz) define* Reference
 
 23.2.3 lambda* Reference
 ------------------------
 
 When using optional and keyword argument lists, using `lambda' for
 creating procedures and using `let-optional' or `let-keywords' is a bit
 lengthy.  Therefore, `lambda*' is provided, which combines the features
 of those macros into a single convenient syntax.
 
    For quick reference, here is the syntax of the formal argument list
 for `lambda*' (brackets are used to indicate grouping only):
 
      ext-param-list ::= [identifier]* [#:optional [ext-var-decl]+]?
        [#:key [ext-var-decl]+ [#:allow-other-keys]?]?
        [[#:rest identifier]|[. identifier]]?
 
      ext-var-decl ::= identifier | ( identifier expression )
 
    The characters `*', `+' and `?' are not to be taken literally; they
 mean respectively, zero or more occurrences, one or more occurrences,
 and one or zero occurrences.
 
  -- library syntax: lambda* formals body
      `lambda*' creates a procedure that takes optional arguments. These
      are specified by putting them inside brackets at the end of the
      parameter list, but before any dotted rest argument. For example,
 
           (lambda* (a b #:optional c d . e) '())
 
      creates a procedure with fixed arguments A and B, optional
      arguments C and D, and rest argument E. If the optional arguments
      are omitted in a call, the variables for them are bound to `#f'.
 
      `lambda*' can also take keyword arguments. For example, a procedure
      defined like this:
 
           (lambda* (#:key xyzzy larch) '())
 
      can be called with any of the argument lists `(#:xyzzy 11)'
      `(#:larch 13)' `(#:larch 42 #:xyzzy 19)' `()'. Whichever arguments
      are given as keywords are bound to values.
 
      Optional and keyword arguments can also be given default values
      which they take on when they are not present in a call, by giving a
      two-item list in place of an optional argument, for example in:
 
           (lambda* (foo #:optional (bar 42) #:key (baz 73))
                (list foo bar baz))
 
      FOO is a fixed argument, BAR is an optional argument with default
      value 42, and baz is a keyword argument with default value 73.
      Default value expressions are not evaluated unless they are needed
      and until the procedure is called.
 
      `lambda*' also supports two more special parameter list keywords.
 
      `lambda*'-defined procedures now throw an error by default if a
      keyword other than one of those specified is found in the actual
      passed arguments. However, specifying `#:allow-other-keys'
      immediately after the keyword argument declarations restores the
      previous behavior of ignoring unknown keywords.  `lambda*' also now
      guarantees that if the same keyword is passed more than once, the
      last one passed is the one that takes effect. For example,
 
           ((lambda* (#:key (heads 0) (tails 0)) (display (list heads tails)))
               #:heads 37 #:tails 42 #:heads 99)
 
      would result in (99 47) being displayed.
 
      `#:rest' is also now provided as a synonym for the dotted syntax
      rest argument. The argument lists `(a . b)' and `(a #:rest b)' are
      equivalent in all respects to `lambda*'. This is provided for more
      similarity to DSSSL, MIT-Scheme and Kawa among others, as well as
      for refugees from other Lisp dialects.
 
Info Catalog (guile.info.gz) let-keywords Reference (guile.info.gz) Optional Arguments (guile.info.gz) define* Reference
automatically generated byinfo2html