Support for defining functions that take python-like keyword arguments. In one of his early talks, Paul Graham wrote about a large system called "Rtml":
Most of the operators in Rtml were designed to take keyword parameters, and what a help that turned out to be. If I wanted to add another dimension to the behavior of one of the operators, I could just add a new keyword parameter, and everyone's existing templates would continue to work. A few of the Rtml operators didn't take keyword parameters, because I didn't think I'd ever need to change them, and almost every one I ended up kicking myself about later. If I could go back and start over from scratch, one of the things I'd change would be that I'd make every Rtml operator take keyword parameters.
See lambda/kwargs, for documentation and examples.
See Optional Arguments, for more information on Guile's standard support for optional and keyword arguments. Quote taken from http://lib.store.yahoo.net/lib/paulgraham/bbnexcerpts.txt.
define/kwargs args | [Special Form] |
Defines a function that takes kwargs. See scheme kwargs lambda/kwargs, for more information.
lambda/kwargs args | [Special Form] |
Defines a function that takes keyword arguments.
bindings is a list of bindings, each of which may either be a symbol or a two-element symbol-and-default-value list. Symbols without specified default values will default to #f.
For example:
(define frobulate (lambda/kwargs (foo (bar 13) (baz 42))
(list foo bar baz)))
(frobulate) ⇒ (#f 13 42)
(frobulate #:baz 3) ⇒ (#f 13 3)
(frobulate #:foo 3) ⇒ (3 13 42)
(frobulate 3 4) ⇒ (3 4 42)
(frobulate 1 2 3) ⇒ (1 2 3)
(frobulate #:baz 2 #:bar 1) ⇒ (#f 1 2)
(frobulate 10 20 #:foo 3) ⇒ (3 20 42)This function differs from the standard lambda* provided by Guile in that invoking the function will accept positional arguments. As an example, the lambda/kwargs behaves more intuitively in the following case:
((lambda* (#:optional (bar 42) #:key (baz 73))
(list bar baz))
1 2) ⇒ (1 73)
((lambda/kwargs ((bar 42) (baz 73))
(list bar baz))
1 2) ⇒ (1 2)The fact that lambda* accepts the extra 2 argument is probably just a bug. In any case, lambda/kwargs does the right thing.