mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-29 19:30:36 +02:00
* NEWS: * README: * doc/r5rs/r5rs.texi: * doc/ref/api-data.texi: * doc/ref/api-debug.texi: * doc/ref/api-evaluation.texi: * doc/ref/api-io.texi: * doc/ref/api-macros.texi: * doc/ref/api-procedures.texi: * doc/ref/api-scheduling.texi: * doc/ref/api-undocumented.texi: * doc/ref/libguile-concepts.texi: * doc/ref/posix.texi: * doc/ref/srfi-modules.texi: * doc/ref/vm.texi: * doc/ref/web.texi: * examples/box-dynamic-module/box.c: * examples/box-dynamic/box.c: * examples/box-module/box.c: * examples/box/box.c: * examples/safe/safe: * examples/scripts/README: * examples/scripts/hello: * gc-benchmarks/larceny/twobit-input-long.sch: * gc-benchmarks/larceny/twobit-smaller.sch: * gc-benchmarks/larceny/twobit.sch: * libguile/expand.c: * libguile/load.c: * libguile/net_db.c: * libguile/scmsigs.c: * libguile/srfi-14.c: * libguile/threads.c: * meta/guile.m4: * module/ice-9/match.upstream.scm: * module/ice-9/ports.scm: * module/language/cps/graphs.scm: * module/scripts/doc-snarf.scm: * module/srfi/srfi-19.scm: * module/system/repl/command.scm: * test-suite/tests/srfi-18.test: Fix typos. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
921 lines
34 KiB
Text
921 lines
34 KiB
Text
@c -*-texinfo-*-
|
|
@c This is part of the GNU Guile Reference Manual.
|
|
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2009, 2010,
|
|
@c 2011, 2012, 2013 Free Software Foundation, Inc.
|
|
@c See the file guile.texi for copying conditions.
|
|
|
|
@node Procedures
|
|
@section Procedures
|
|
|
|
@menu
|
|
* Lambda:: Basic procedure creation using lambda.
|
|
* Primitive Procedures:: Procedures defined in C.
|
|
* Compiled Procedures:: Scheme procedures can be compiled.
|
|
* Optional Arguments:: Handling keyword, optional and rest arguments.
|
|
* Case-lambda:: One function, multiple arities.
|
|
* Higher-Order Functions:: Function that take or return functions.
|
|
* Procedure Properties:: Procedure properties and meta-information.
|
|
* Procedures with Setters:: Procedures with setters.
|
|
* Inlinable Procedures:: Procedures that can be inlined.
|
|
@end menu
|
|
|
|
|
|
@node Lambda
|
|
@subsection Lambda: Basic Procedure Creation
|
|
@cindex lambda
|
|
|
|
A @code{lambda} expression evaluates to a procedure. The environment
|
|
which is in effect when a @code{lambda} expression is evaluated is
|
|
enclosed in the newly created procedure, this is referred to as a
|
|
@dfn{closure} (@pxref{About Closure}).
|
|
|
|
When a procedure created by @code{lambda} is called with some actual
|
|
arguments, the environment enclosed in the procedure is extended by
|
|
binding the variables named in the formal argument list to new locations
|
|
and storing the actual arguments into these locations. Then the body of
|
|
the @code{lambda} expression is evaluated sequentially. The result of
|
|
the last expression in the procedure body is then the result of the
|
|
procedure invocation.
|
|
|
|
The following examples will show how procedures can be created using
|
|
@code{lambda}, and what you can do with these procedures.
|
|
|
|
@lisp
|
|
(lambda (x) (+ x x)) @result{} @r{a procedure}
|
|
((lambda (x) (+ x x)) 4) @result{} 8
|
|
@end lisp
|
|
|
|
The fact that the environment in effect when creating a procedure is
|
|
enclosed in the procedure is shown with this example:
|
|
|
|
@lisp
|
|
(define add4
|
|
(let ((x 4))
|
|
(lambda (y) (+ x y))))
|
|
(add4 6) @result{} 10
|
|
@end lisp
|
|
|
|
|
|
@deffn syntax lambda formals body
|
|
@var{formals} should be a formal argument list as described in the
|
|
following table.
|
|
|
|
@table @code
|
|
@item (@var{variable1} @dots{})
|
|
The procedure takes a fixed number of arguments; when the procedure is
|
|
called, the arguments will be stored into the newly created location for
|
|
the formal variables.
|
|
@item @var{variable}
|
|
The procedure takes any number of arguments; when the procedure is
|
|
called, the sequence of actual arguments will be converted into a list
|
|
and stored into the newly created location for the formal variable.
|
|
@item (@var{variable1} @dots{} @var{variablen} . @var{variablen+1})
|
|
If a space-delimited period precedes the last variable, then the
|
|
procedure takes @var{n} or more variables where @var{n} is the number
|
|
of formal arguments before the period. There must be at least one
|
|
argument before the period. The first @var{n} actual arguments will be
|
|
stored into the newly allocated locations for the first @var{n} formal
|
|
arguments and the sequence of the remaining actual arguments is
|
|
converted into a list and the stored into the location for the last
|
|
formal argument. If there are exactly @var{n} actual arguments, the
|
|
empty list is stored into the location of the last formal argument.
|
|
@end table
|
|
|
|
The list in @var{variable} or @var{variablen+1} is always newly
|
|
created and the procedure can modify it if desired. This is the case
|
|
even when the procedure is invoked via @code{apply}, the required part
|
|
of the list argument there will be copied (@pxref{Fly Evaluation,,
|
|
Procedures for On the Fly Evaluation}).
|
|
|
|
@var{body} is a sequence of Scheme expressions which are evaluated in
|
|
order when the procedure is invoked.
|
|
@end deffn
|
|
|
|
@node Primitive Procedures
|
|
@subsection Primitive Procedures
|
|
@cindex primitives
|
|
@cindex primitive procedures
|
|
|
|
Procedures written in C can be registered for use from Scheme,
|
|
provided they take only arguments of type @code{SCM} and return
|
|
@code{SCM} values. @code{scm_c_define_gsubr} is likely to be the most
|
|
useful mechanism, combining the process of registration
|
|
(@code{scm_c_make_gsubr}) and definition (@code{scm_define}).
|
|
|
|
@deftypefun SCM scm_c_make_gsubr (const char *name, int req, int opt, int rst, fcn)
|
|
Register a C procedure @var{fcn} as a ``subr'' --- a primitive
|
|
subroutine that can be called from Scheme. It will be associated with
|
|
the given @var{name} but no environment binding will be created. The
|
|
arguments @var{req}, @var{opt} and @var{rst} specify the number of
|
|
required, optional and ``rest'' arguments respectively. The total
|
|
number of these arguments should match the actual number of arguments
|
|
to @var{fcn}, but may not exceed 10. The number of rest arguments should be 0 or 1.
|
|
@code{scm_c_make_gsubr} returns a value of type @code{SCM} which is a
|
|
``handle'' for the procedure.
|
|
@end deftypefun
|
|
|
|
@deftypefun SCM scm_c_define_gsubr (const char *name, int req, int opt, int rst, fcn)
|
|
Register a C procedure @var{fcn}, as for @code{scm_c_make_gsubr}
|
|
above, and additionally create a top-level Scheme binding for the
|
|
procedure in the ``current environment'' using @code{scm_define}.
|
|
@code{scm_c_define_gsubr} returns a handle for the procedure in the
|
|
same way as @code{scm_c_make_gsubr}, which is usually not further
|
|
required.
|
|
@end deftypefun
|
|
|
|
@node Compiled Procedures
|
|
@subsection Compiled Procedures
|
|
|
|
The evaluation strategy given in @ref{Lambda} describes how procedures
|
|
are @dfn{interpreted}. Interpretation operates directly on expanded
|
|
Scheme source code, recursively calling the evaluator to obtain the
|
|
value of nested expressions.
|
|
|
|
Most procedures are compiled, however. This means that Guile has done
|
|
some pre-computation on the procedure, to determine what it will need to
|
|
do each time the procedure runs. Compiled procedures run faster than
|
|
interpreted procedures.
|
|
|
|
Loading files is the normal way that compiled procedures come to
|
|
being. If Guile sees that a file is uncompiled, or that its compiled
|
|
file is out of date, it will attempt to compile the file when it is
|
|
loaded, and save the result to disk. Procedures can be compiled at
|
|
runtime as well. @xref{Read/Load/Eval/Compile}, for more information
|
|
on runtime compilation.
|
|
|
|
Compiled procedures, also known as @dfn{programs}, respond to all
|
|
procedures that operate on procedures: you can pass a program to
|
|
@code{procedure?}, @code{procedure-name}, and so on (@pxref{Procedure
|
|
Properties}). In addition, there are a few more accessors for low-level
|
|
details on programs.
|
|
|
|
Most people won't need to use the routines described in this section,
|
|
but it's good to have them documented. You'll have to include the
|
|
appropriate module first, though:
|
|
|
|
@example
|
|
(use-modules (system vm program))
|
|
@end example
|
|
|
|
@deffn {Scheme Procedure} program? obj
|
|
@deffnx {C Function} scm_program_p (obj)
|
|
Returns @code{#t} if @var{obj} is a compiled procedure, or @code{#f}
|
|
otherwise.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} program-code program
|
|
@deffnx {C Function} scm_program_code (program)
|
|
Returns the address of the program's entry, as an integer. This address
|
|
is mostly useful to procedures in @code{(system vm debug)}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} program-num-free-variable program
|
|
@deffnx {C Function} scm_program_num_free_variables (program)
|
|
Return the number of free variables captured by this program.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} program-free-variable-ref program n
|
|
@deffnx {C Function} scm_program_free_variable-ref (program, n)
|
|
@deffnx {Scheme Procedure} program-free-variable-set! program n val
|
|
@deffnx {C Function} scm_program_free_variable_set_x (program, n, val)
|
|
Accessors for a program's free variables. Some of the values captured
|
|
are actually in variable ``boxes''. @xref{Variables and the VM}, for
|
|
more information.
|
|
|
|
Users must not modify the returned value unless they think they're
|
|
really clever.
|
|
@end deffn
|
|
|
|
@c FIXME
|
|
|
|
@deffn {Scheme Procedure} program-bindings program
|
|
@deffnx {Scheme Procedure} make-binding name boxed? index start end
|
|
@deffnx {Scheme Procedure} binding:name binding
|
|
@deffnx {Scheme Procedure} binding:boxed? binding
|
|
@deffnx {Scheme Procedure} binding:index binding
|
|
@deffnx {Scheme Procedure} binding:start binding
|
|
@deffnx {Scheme Procedure} binding:end binding
|
|
Bindings annotations for programs, along with their accessors.
|
|
|
|
Bindings declare names and liveness extents for block-local variables.
|
|
The best way to see what these are is to play around with them at a
|
|
REPL. @xref{VM Concepts}, for more information.
|
|
|
|
Note that bindings information is stored in a program as part of its
|
|
metadata thunk, so including it in the generated object code does not
|
|
impose a runtime performance penalty.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} program-sources program
|
|
@deffnx {Scheme Procedure} source:addr source
|
|
@deffnx {Scheme Procedure} source:line source
|
|
@deffnx {Scheme Procedure} source:column source
|
|
@deffnx {Scheme Procedure} source:file source
|
|
Source location annotations for programs, along with their accessors.
|
|
|
|
Source location information propagates through the compiler and ends
|
|
up being serialized to the program's metadata. This information is
|
|
keyed by the offset of the instruction pointer within the object code
|
|
of the program. Specifically, it is keyed on the @code{ip} @emph{just
|
|
following} an instruction, so that backtraces can find the source
|
|
location of a call that is in progress.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} program-arities program
|
|
@deffnx {C Function} scm_program_arities (program)
|
|
@deffnx {Scheme Procedure} program-arity program ip
|
|
@deffnx {Scheme Procedure} arity:start arity
|
|
@deffnx {Scheme Procedure} arity:end arity
|
|
@deffnx {Scheme Procedure} arity:nreq arity
|
|
@deffnx {Scheme Procedure} arity:nopt arity
|
|
@deffnx {Scheme Procedure} arity:rest? arity
|
|
@deffnx {Scheme Procedure} arity:kw arity
|
|
@deffnx {Scheme Procedure} arity:allow-other-keys? arity
|
|
Accessors for a representation of the ``arity'' of a program.
|
|
|
|
The normal case is that a procedure has one arity. For example,
|
|
@code{(lambda (x) x)}, takes one required argument, and that's it. One
|
|
could access that number of required arguments via @code{(arity:nreq
|
|
(program-arities (lambda (x) x)))}. Similarly, @code{arity:nopt} gets
|
|
the number of optional arguments, and @code{arity:rest?} returns a true
|
|
value if the procedure has a rest arg.
|
|
|
|
@code{arity:kw} returns a list of @code{(@var{kw} . @var{idx})} pairs,
|
|
if the procedure has keyword arguments. The @var{idx} refers to the
|
|
@var{idx}th local variable; @xref{Variables and the VM}, for more
|
|
information. Finally @code{arity:allow-other-keys?} returns a true
|
|
value if other keys are allowed. @xref{Optional Arguments}, for more
|
|
information.
|
|
|
|
So what about @code{arity:start} and @code{arity:end}, then? They
|
|
return the range of bytes in the program's bytecode for which a given
|
|
arity is valid. You see, a procedure can actually have more than one
|
|
arity. The question, ``what is a procedure's arity'' only really makes
|
|
sense at certain points in the program, delimited by these
|
|
@code{arity:start} and @code{arity:end} values.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} program-arguments-alist program [ip]
|
|
Return an association list describing the arguments that @var{program} accepts, or
|
|
@code{#f} if the information cannot be obtained.
|
|
|
|
The alist keys that are currently defined are `required', `optional',
|
|
`keyword', `allow-other-keys?', and `rest'. For example:
|
|
|
|
@example
|
|
(program-arguments-alist
|
|
(lambda* (a b #:optional c #:key (d 1) #:rest e)
|
|
#t)) @result{}
|
|
((required . (a b))
|
|
(optional . (c))
|
|
(keyword . ((#:d . 4)))
|
|
(allow-other-keys? . #f)
|
|
(rest . d))
|
|
@end example
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} program-lambda-list program [ip]
|
|
Return a representation of the arguments of @var{program} as a lambda
|
|
list, or @code{#f} if this information is not available.
|
|
|
|
For example:
|
|
|
|
@example
|
|
(program-lambda-list
|
|
(lambda* (a b #:optional c #:key (d 1) #:rest e)
|
|
#t)) @result{}
|
|
@end example
|
|
@end deffn
|
|
|
|
@node Optional Arguments
|
|
@subsection Optional Arguments
|
|
|
|
Scheme procedures, as defined in R5RS, can either handle a fixed number
|
|
of actual arguments, or a fixed number of actual arguments followed by
|
|
arbitrarily many additional arguments. Writing procedures of variable
|
|
arity can be useful, but unfortunately, the syntactic means for handling
|
|
argument lists of varying length is a bit inconvenient. It is possible
|
|
to give names to the fixed number of arguments, but the remaining
|
|
(optional) arguments can be only referenced as a list of values
|
|
(@pxref{Lambda}).
|
|
|
|
For this reason, Guile provides an extension to @code{lambda},
|
|
@code{lambda*}, which allows the user to define procedures with
|
|
optional and keyword arguments. In addition, Guile's virtual machine
|
|
has low-level support for optional and keyword argument dispatch.
|
|
Calls to procedures with optional and keyword arguments can be made
|
|
cheaply, without allocating a rest list.
|
|
|
|
@menu
|
|
* lambda* and define*:: Creating advanced argument handling procedures.
|
|
* ice-9 optargs:: (ice-9 optargs) provides some utilities.
|
|
@end menu
|
|
|
|
|
|
@node lambda* and define*
|
|
@subsubsection lambda* and define*.
|
|
|
|
@code{lambda*} is like @code{lambda}, except with some extensions to
|
|
allow optional and keyword arguments.
|
|
|
|
@deffn {library syntax} lambda* ([var@dots{}] @* @
|
|
[#:optional vardef@dots{}] @* @
|
|
[#:key vardef@dots{} [#:allow-other-keys]] @* @
|
|
[#:rest var | . var]) @* @
|
|
body1 body2 @dots{}
|
|
@sp 1
|
|
Create a procedure which takes optional and/or keyword arguments
|
|
specified with @code{#:optional} and @code{#:key}. For example,
|
|
|
|
@lisp
|
|
(lambda* (a b #:optional c d . e) '())
|
|
@end lisp
|
|
|
|
is a procedure with fixed arguments @var{a} and @var{b}, optional
|
|
arguments @var{c} and @var{d}, and rest argument @var{e}. If the
|
|
optional arguments are omitted in a call, the variables for them are
|
|
bound to @code{#f}.
|
|
|
|
@fnindex define*
|
|
Likewise, @code{define*} is syntactic sugar for defining procedures
|
|
using @code{lambda*}.
|
|
|
|
@code{lambda*} can also make procedures with keyword arguments. For
|
|
example, a procedure defined like this:
|
|
|
|
@lisp
|
|
(define* (sir-yes-sir #:key action how-high)
|
|
(list action how-high))
|
|
@end lisp
|
|
|
|
can be called as @code{(sir-yes-sir #:action 'jump)},
|
|
@code{(sir-yes-sir #:how-high 13)}, @code{(sir-yes-sir #:action
|
|
'lay-down #:how-high 0)}, or just @code{(sir-yes-sir)}. Whichever
|
|
arguments are given as keywords are bound to values (and those not
|
|
given are @code{#f}).
|
|
|
|
Optional and keyword arguments can also have default values to take
|
|
when not present in a call, by giving a two-element list of variable
|
|
name and expression. For example in
|
|
|
|
@lisp
|
|
(define* (frob foo #:optional (bar 42) #:key (baz 73))
|
|
(list foo bar baz))
|
|
@end lisp
|
|
|
|
@var{foo} is a fixed argument, @var{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.
|
|
|
|
Normally it's an error if a call has keywords other than those
|
|
specified by @code{#:key}, but adding @code{#:allow-other-keys} to the
|
|
definition (after the keyword argument declarations) will ignore
|
|
unknown keywords.
|
|
|
|
If a call has a keyword given twice, the last value is used. For
|
|
example,
|
|
|
|
@lisp
|
|
(define* (flips #:key (heads 0) (tails 0))
|
|
(display (list heads tails)))
|
|
|
|
(flips #:heads 37 #:tails 42 #:heads 99)
|
|
@print{} (99 42)
|
|
@end lisp
|
|
|
|
@code{#:rest} is a synonym for the dotted syntax rest argument. The
|
|
argument lists @code{(a . b)} and @code{(a #:rest b)} are equivalent
|
|
in all respects. This is provided for more similarity to DSSSL,
|
|
MIT-Scheme and Kawa among others, as well as for refugees from other
|
|
Lisp dialects.
|
|
|
|
When @code{#:key} is used together with a rest argument, the keyword
|
|
parameters in a call all remain in the rest list. This is the same as
|
|
Common Lisp. For example,
|
|
|
|
@lisp
|
|
((lambda* (#:key (x 0) #:allow-other-keys #:rest r)
|
|
(display r))
|
|
#:x 123 #:y 456)
|
|
@print{} (#:x 123 #:y 456)
|
|
@end lisp
|
|
|
|
@code{#:optional} and @code{#:key} establish their bindings
|
|
successively, from left to right. This means default expressions can
|
|
refer back to prior parameters, for example
|
|
|
|
@lisp
|
|
(lambda* (start #:optional (end (+ 10 start)))
|
|
(do ((i start (1+ i)))
|
|
((> i end))
|
|
(display i)))
|
|
@end lisp
|
|
|
|
The exception to this left-to-right scoping rule is the rest argument.
|
|
If there is a rest argument, it is bound after the optional arguments,
|
|
but before the keyword arguments.
|
|
@end deffn
|
|
|
|
|
|
@node ice-9 optargs
|
|
@subsubsection (ice-9 optargs)
|
|
|
|
Before Guile 2.0, @code{lambda*} and @code{define*} were implemented
|
|
using macros that processed rest list arguments. This was not optimal,
|
|
as calling procedures with optional arguments had to allocate rest
|
|
lists at every procedure invocation. Guile 2.0 improved this
|
|
situation by bringing optional and keyword arguments into Guile's
|
|
core.
|
|
|
|
However there are occasions in which you have a list and want to parse
|
|
it for optional or keyword arguments. Guile's @code{(ice-9 optargs)}
|
|
provides some macros to help with that task.
|
|
|
|
The syntax @code{let-optional} and @code{let-optional*} are for
|
|
destructuring rest argument lists and giving names to the various list
|
|
elements. @code{let-optional} binds all variables simultaneously, while
|
|
@code{let-optional*} binds them sequentially, consistent with @code{let}
|
|
and @code{let*} (@pxref{Local Bindings}).
|
|
|
|
@deffn {library syntax} let-optional rest-arg (binding @dots{}) body1 body2 @dots{}
|
|
@deffnx {library syntax} let-optional* rest-arg (binding @dots{}) body1 body2 @dots{}
|
|
These two macros give you an optional argument interface that is very
|
|
@dfn{Schemey} and introduces no fancy syntax. They are compatible with
|
|
the scsh macros of the same name, but are slightly extended. Each of
|
|
@var{binding} may be of one of the forms @var{var} or @code{(@var{var}
|
|
@var{default-value})}. @var{rest-arg} should be the rest-argument of the
|
|
procedures these are used from. The items in @var{rest-arg} are
|
|
sequentially bound to the variable names are given. When @var{rest-arg}
|
|
runs out, the remaining vars are bound either to the default values or
|
|
@code{#f} if no default value was specified. @var{rest-arg} remains
|
|
bound to whatever may have been left of @var{rest-arg}.
|
|
|
|
After binding the variables, the expressions @var{body1} @var{body2} @dots{}
|
|
are evaluated in order.
|
|
@end deffn
|
|
|
|
Similarly, @code{let-keywords} and @code{let-keywords*} extract values
|
|
from keyword style argument lists, binding local variables to those
|
|
values or to defaults.
|
|
|
|
@deffn {library syntax} let-keywords args allow-other-keys? (binding @dots{}) body1 body2 @dots{}
|
|
@deffnx {library syntax} let-keywords* args allow-other-keys? (binding @dots{}) body1 body2 @dots{}
|
|
@var{args} is evaluated and should give a list of the form
|
|
@code{(#:keyword1 value1 #:keyword2 value2 @dots{})}. The
|
|
@var{binding}s are variables and default expressions, with the variables
|
|
to be set (by name) from the keyword values. The @var{body1}
|
|
@var{body2} @dots{} forms are then evaluated and the last is the
|
|
result. An example will make the syntax clearest,
|
|
|
|
@example
|
|
(define args '(#:xyzzy "hello" #:foo "world"))
|
|
|
|
(let-keywords args #t
|
|
((foo "default for foo")
|
|
(bar (string-append "default" "for" "bar")))
|
|
(display foo)
|
|
(display ", ")
|
|
(display bar))
|
|
@print{} world, defaultforbar
|
|
@end example
|
|
|
|
The binding for @code{foo} comes from the @code{#:foo} keyword in
|
|
@code{args}. But the binding for @code{bar} is the default in the
|
|
@code{let-keywords}, since there's no @code{#:bar} in the args.
|
|
|
|
@var{allow-other-keys?} is evaluated and controls whether unknown
|
|
keywords are allowed in the @var{args} list. When true other keys are
|
|
ignored (such as @code{#:xyzzy} in the example), when @code{#f} an
|
|
error is thrown for anything unknown.
|
|
@end deffn
|
|
|
|
@code{(ice-9 optargs)} also provides some more @code{define*} sugar,
|
|
which is not so useful with modern Guile coding, but still supported:
|
|
@code{define*-public} is the @code{lambda*} version of
|
|
@code{define-public}; @code{defmacro*} and @code{defmacro*-public}
|
|
exist for defining macros with the improved argument list handling
|
|
possibilities. The @code{-public} versions not only define the
|
|
procedures/macros, but also export them from the current module.
|
|
|
|
@deffn {library syntax} define*-public formals body1 body2 @dots{}
|
|
Like a mix of @code{define*} and @code{define-public}.
|
|
@end deffn
|
|
|
|
@deffn {library syntax} defmacro* name formals body1 body2 @dots{}
|
|
@deffnx {library syntax} defmacro*-public name formals body1 body2 @dots{}
|
|
These are just like @code{defmacro} and @code{defmacro-public} except that they
|
|
take @code{lambda*}-style extended parameter lists, where @code{#:optional},
|
|
@code{#:key}, @code{#:allow-other-keys} and @code{#:rest} are allowed with the usual
|
|
semantics. Here is an example of a macro with an optional argument:
|
|
|
|
@lisp
|
|
(defmacro* transmogrify (a #:optional b)
|
|
(a 1))
|
|
@end lisp
|
|
@end deffn
|
|
|
|
@node Case-lambda
|
|
@subsection Case-lambda
|
|
@cindex SRFI-16
|
|
@cindex variable arity
|
|
@cindex arity, variable
|
|
|
|
R5RS's rest arguments are indeed useful and very general, but they
|
|
often aren't the most appropriate or efficient means to get the job
|
|
done. For example, @code{lambda*} is a much better solution to the
|
|
optional argument problem than @code{lambda} with rest arguments.
|
|
|
|
@fnindex case-lambda
|
|
Likewise, @code{case-lambda} works well for when you want one
|
|
procedure to do double duty (or triple, or ...), without the penalty
|
|
of consing a rest list.
|
|
|
|
For example:
|
|
|
|
@lisp
|
|
(define (make-accum n)
|
|
(case-lambda
|
|
(() n)
|
|
((m) (set! n (+ n m)) n)))
|
|
|
|
(define a (make-accum 20))
|
|
(a) @result{} 20
|
|
(a 10) @result{} 30
|
|
(a) @result{} 30
|
|
@end lisp
|
|
|
|
The value returned by a @code{case-lambda} form is a procedure which
|
|
matches the number of actual arguments against the formals in the
|
|
various clauses, in order. The first matching clause is selected, the
|
|
corresponding values from the actual parameter list are bound to the
|
|
variable names in the clauses and the body of the clause is evaluated.
|
|
If no clause matches, an error is signaled.
|
|
|
|
The syntax of the @code{case-lambda} form is defined in the following
|
|
EBNF grammar. @dfn{Formals} means a formal argument list just like
|
|
with @code{lambda} (@pxref{Lambda}).
|
|
|
|
@example
|
|
@group
|
|
<case-lambda>
|
|
--> (case-lambda <case-lambda-clause>*)
|
|
--> (case-lambda <docstring> <case-lambda-clause>*)
|
|
<case-lambda-clause>
|
|
--> (<formals> <definition-or-command>*)
|
|
<formals>
|
|
--> (<identifier>*)
|
|
| (<identifier>* . <identifier>)
|
|
| <identifier>
|
|
@end group
|
|
@end example
|
|
|
|
Rest lists can be useful with @code{case-lambda}:
|
|
|
|
@lisp
|
|
(define plus
|
|
(case-lambda
|
|
"Return the sum of all arguments."
|
|
(() 0)
|
|
((a) a)
|
|
((a b) (+ a b))
|
|
((a b . rest) (apply plus (+ a b) rest))))
|
|
(plus 1 2 3) @result{} 6
|
|
@end lisp
|
|
|
|
@fnindex case-lambda*
|
|
Also, for completeness. Guile defines @code{case-lambda*} as well,
|
|
which is like @code{case-lambda}, except with @code{lambda*} clauses.
|
|
A @code{case-lambda*} clause matches if the arguments fill the
|
|
required arguments, but are not too many for the optional and/or rest
|
|
arguments.
|
|
|
|
Keyword arguments are possible with @code{case-lambda*} as well, but
|
|
they do not contribute to the ``matching'' behavior, and their
|
|
interactions with required, optional, and rest arguments can be
|
|
surprising.
|
|
|
|
For the purposes of @code{case-lambda*} (and of @code{case-lambda}, as a
|
|
special case), a clause @dfn{matches} if it has enough required
|
|
arguments, and not too many positional arguments. The required
|
|
arguments are any arguments before the @code{#:optional}, @code{#:key},
|
|
and @code{#:rest} arguments. @dfn{Positional} arguments are the
|
|
required arguments, together with the optional arguments.
|
|
|
|
In the absence of @code{#:key} or @code{#:rest} arguments, it's easy to
|
|
see how there could be too many positional arguments: you pass 5
|
|
arguments to a function that only takes 4 arguments, including optional
|
|
arguments. If there is a @code{#:rest} argument, there can never be too
|
|
many positional arguments: any application with enough required
|
|
arguments for a clause will match that clause, even if there are also
|
|
@code{#:key} arguments.
|
|
|
|
Otherwise, for applications to a clause with @code{#:key} arguments (and
|
|
without a @code{#:rest} argument), a clause will match there only if
|
|
there are enough required arguments and if the next argument after
|
|
binding required and optional arguments, if any, is a keyword. For
|
|
efficiency reasons, Guile is currently unable to include keyword
|
|
arguments in the matching algorithm. Clauses match on positional
|
|
arguments only, not by comparing a given keyword to the available set of
|
|
keyword arguments that a function has.
|
|
|
|
Some examples follow.
|
|
|
|
@example
|
|
(define f
|
|
(case-lambda*
|
|
((a #:optional b) 'clause-1)
|
|
((a #:optional b #:key c) 'clause-2)
|
|
((a #:key d) 'clause-3)
|
|
((#:key e #:rest f) 'clause-4)))
|
|
|
|
(f) @result{} clause-4
|
|
(f 1) @result{} clause-1
|
|
(f) @result{} clause-4
|
|
(f #:e 10) clause-1
|
|
(f 1 #:foo) clause-1
|
|
(f 1 #:c 2) clause-2
|
|
(f #:a #:b #:c #:d #:e) clause-4
|
|
|
|
;; clause-2 will match anything that clause-3 would match.
|
|
(f 1 #:d 2) @result{} error: bad keyword args in clause 2
|
|
@end example
|
|
|
|
Don't forget that the clauses are matched in order, and the first
|
|
matching clause will be taken. This can result in a keyword being bound
|
|
to a required argument, as in the case of @code{f #:e 10}.
|
|
|
|
|
|
@node Higher-Order Functions
|
|
@subsection Higher-Order Functions
|
|
|
|
@cindex higher-order functions
|
|
|
|
As a functional programming language, Scheme allows the definition of
|
|
@dfn{higher-order functions}, i.e., functions that take functions as
|
|
arguments and/or return functions. Utilities to derive procedures from
|
|
other procedures are provided and described below.
|
|
|
|
@deffn {Scheme Procedure} const value
|
|
Return a procedure that accepts any number of arguments and returns
|
|
@var{value}.
|
|
|
|
@lisp
|
|
(procedure? (const 3)) @result{} #t
|
|
((const 'hello)) @result{} hello
|
|
((const 'hello) 'world) @result{} hello
|
|
@end lisp
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} negate proc
|
|
Return a procedure with the same arity as @var{proc} that returns the
|
|
@code{not} of @var{proc}'s result.
|
|
|
|
@lisp
|
|
(procedure? (negate number?)) @result{} #t
|
|
((negate odd?) 2) @result{} #t
|
|
((negate real?) 'dream) @result{} #t
|
|
((negate string-prefix?) "GNU" "GNU Guile")
|
|
@result{} #f
|
|
(filter (negate number?) '(a 2 "b"))
|
|
@result{} (a "b")
|
|
@end lisp
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} compose proc1 proc2 @dots{}
|
|
Compose @var{proc1} with the procedures @var{proc2} @dots{} such that
|
|
the last @var{proc} argument is applied first and @var{proc1} last, and
|
|
return the resulting procedure. The given procedures must have
|
|
compatible arity.
|
|
|
|
@lisp
|
|
(procedure? (compose 1+ 1-)) @result{} #t
|
|
((compose sqrt 1+ 1+) 2) @result{} 2.0
|
|
((compose 1+ sqrt) 3) @result{} 2.73205080756888
|
|
(eq? (compose 1+) 1+) @result{} #t
|
|
|
|
((compose zip unzip2) '((1 2) (a b)))
|
|
@result{} ((1 2) (a b))
|
|
@end lisp
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} identity x
|
|
Return X.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} and=> value proc
|
|
When @var{value} is @code{#f}, return @code{#f}. Otherwise, return
|
|
@code{(@var{proc} @var{value})}.
|
|
@end deffn
|
|
|
|
@node Procedure Properties
|
|
@subsection Procedure Properties and Meta-information
|
|
|
|
In addition to the information that is strictly necessary to run,
|
|
procedures may have other associated information. For example, the
|
|
name of a procedure is information not for the procedure, but about
|
|
the procedure. This meta-information can be accessed via the procedure
|
|
properties interface.
|
|
|
|
The first group of procedures in this meta-interface are predicates to
|
|
test whether a Scheme object is a procedure, or a special procedure,
|
|
respectively. @code{procedure?} is the most general predicates, it
|
|
returns @code{#t} for any kind of procedure.
|
|
|
|
@rnindex procedure?
|
|
@deffn {Scheme Procedure} procedure? obj
|
|
@deffnx {C Function} scm_procedure_p (obj)
|
|
Return @code{#t} if @var{obj} is a procedure.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} thunk? obj
|
|
@deffnx {C Function} scm_thunk_p (obj)
|
|
Return @code{#t} if @var{obj} is a procedure that can be called with
|
|
zero arguments.
|
|
@end deffn
|
|
|
|
@cindex procedure properties
|
|
Procedure properties are general properties associated with
|
|
procedures. These can be the name of a procedure or other relevant
|
|
information, such as debug hints.
|
|
|
|
@deffn {Scheme Procedure} procedure-name proc
|
|
@deffnx {C Function} scm_procedure_name (proc)
|
|
Return the name of the procedure @var{proc}
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} procedure-source proc
|
|
@deffnx {C Function} scm_procedure_source (proc)
|
|
Return the source of the procedure @var{proc}. Returns @code{#f} if
|
|
the source code is not available.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} procedure-properties proc
|
|
@deffnx {C Function} scm_procedure_properties (proc)
|
|
Return the properties associated with @var{proc}, as an association
|
|
list.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} procedure-property proc key
|
|
@deffnx {C Function} scm_procedure_property (proc, key)
|
|
Return the property of @var{proc} with name @var{key}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} set-procedure-properties! proc alist
|
|
@deffnx {C Function} scm_set_procedure_properties_x (proc, alist)
|
|
Set @var{proc}'s property list to @var{alist}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} set-procedure-property! proc key value
|
|
@deffnx {C Function} scm_set_procedure_property_x (proc, key, value)
|
|
In @var{proc}'s property list, set the property named @var{key} to
|
|
@var{value}.
|
|
@end deffn
|
|
|
|
@cindex procedure documentation
|
|
Documentation for a procedure can be accessed with the procedure
|
|
@code{procedure-documentation}.
|
|
|
|
@deffn {Scheme Procedure} procedure-documentation proc
|
|
@deffnx {C Function} scm_procedure_documentation (proc)
|
|
Return the documentation string associated with @code{proc}. By
|
|
convention, if a procedure contains more than one expression and the
|
|
first expression is a string constant, that string is assumed to contain
|
|
documentation for that procedure.
|
|
@end deffn
|
|
|
|
|
|
@node Procedures with Setters
|
|
@subsection Procedures with Setters
|
|
|
|
@c FIXME::martin: Review me!
|
|
|
|
@c FIXME::martin: Document `operator struct'.
|
|
|
|
@cindex procedure with setter
|
|
@cindex setter
|
|
A @dfn{procedure with setter} is a special kind of procedure which
|
|
normally behaves like any accessor procedure, that is a procedure which
|
|
accesses a data structure. The difference is that this kind of
|
|
procedure has a so-called @dfn{setter} attached, which is a procedure
|
|
for storing something into a data structure.
|
|
|
|
Procedures with setters are treated specially when the procedure appears
|
|
in the special form @code{set!}. @c (REFFIXME)
|
|
How it works is best shown by example.
|
|
|
|
Suppose we have a procedure called @code{foo-ref}, which accepts two
|
|
arguments, a value of type @code{foo} and an integer. The procedure
|
|
returns the value stored at the given index in the @code{foo} object.
|
|
Let @code{f} be a variable containing such a @code{foo} data
|
|
structure.@footnote{Working definitions would be:
|
|
@lisp
|
|
(define foo-ref vector-ref)
|
|
(define foo-set! vector-set!)
|
|
(define f (make-vector 2 #f))
|
|
@end lisp
|
|
}
|
|
|
|
@lisp
|
|
(foo-ref f 0) @result{} bar
|
|
(foo-ref f 1) @result{} braz
|
|
@end lisp
|
|
|
|
Also suppose that a corresponding setter procedure called
|
|
@code{foo-set!} does exist.
|
|
|
|
@lisp
|
|
(foo-set! f 0 'bla)
|
|
(foo-ref f 0) @result{} bla
|
|
@end lisp
|
|
|
|
Now we could create a new procedure called @code{foo}, which is a
|
|
procedure with setter, by calling @code{make-procedure-with-setter} with
|
|
the accessor and setter procedures @code{foo-ref} and @code{foo-set!}.
|
|
Let us call this new procedure @code{foo}.
|
|
|
|
@lisp
|
|
(define foo (make-procedure-with-setter foo-ref foo-set!))
|
|
@end lisp
|
|
|
|
@code{foo} can from now on be used to either read from the data
|
|
structure stored in @code{f}, or to write into the structure.
|
|
|
|
@lisp
|
|
(set! (foo f 0) 'dum)
|
|
(foo f 0) @result{} dum
|
|
@end lisp
|
|
|
|
@deffn {Scheme Procedure} make-procedure-with-setter procedure setter
|
|
@deffnx {C Function} scm_make_procedure_with_setter (procedure, setter)
|
|
Create a new procedure which behaves like @var{procedure}, but
|
|
with the associated setter @var{setter}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} procedure-with-setter? obj
|
|
@deffnx {C Function} scm_procedure_with_setter_p (obj)
|
|
Return @code{#t} if @var{obj} is a procedure with an
|
|
associated setter procedure.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} procedure proc
|
|
@deffnx {C Function} scm_procedure (proc)
|
|
Return the procedure of @var{proc}, which must be an
|
|
applicable struct.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} setter proc
|
|
Return the setter of @var{proc}, which must be either a procedure with
|
|
setter or an operator struct.
|
|
@end deffn
|
|
|
|
@node Inlinable Procedures
|
|
@subsection Inlinable Procedures
|
|
|
|
@cindex inlining
|
|
@cindex procedure inlining
|
|
You can define an @dfn{inlinable procedure} by using
|
|
@code{define-inlinable} instead of @code{define}. An inlinable
|
|
procedure behaves the same as a regular procedure, but direct calls will
|
|
result in the procedure body being inlined into the caller.
|
|
|
|
@cindex partial evaluator
|
|
Bear in mind that starting from version 2.0.3, Guile has a partial
|
|
evaluator that can inline the body of inner procedures when deemed
|
|
appropriate:
|
|
|
|
@example
|
|
scheme@@(guile-user)> ,optimize (define (foo x)
|
|
(define (bar) (+ x 3))
|
|
(* (bar) 2))
|
|
$1 = (define foo
|
|
(lambda (#@{x 94@}#) (* (+ #@{x 94@}# 3) 2)))
|
|
@end example
|
|
|
|
@noindent
|
|
The partial evaluator does not inline top-level bindings, though, so
|
|
this is a situation where you may find it interesting to use
|
|
@code{define-inlinable}.
|
|
|
|
Procedures defined with @code{define-inlinable} are @emph{always}
|
|
inlined, at all direct call sites. This eliminates function call
|
|
overhead at the expense of an increase in code size. Additionally, the
|
|
caller will not transparently use the new definition if the inline
|
|
procedure is redefined. It is not possible to trace an inlined
|
|
procedures or install a breakpoint in it (@pxref{Traps}). For these
|
|
reasons, you should not make a procedure inlinable unless it
|
|
demonstrably improves performance in a crucial way.
|
|
|
|
In general, only small procedures should be considered for inlining, as
|
|
making large procedures inlinable will probably result in an increase in
|
|
code size. Additionally, the elimination of the call overhead rarely
|
|
matters for large procedures.
|
|
|
|
@deffn {Scheme Syntax} define-inlinable (name parameter @dots{}) body1 body2 @dots{}
|
|
Define @var{name} as a procedure with parameters @var{parameter}s and
|
|
bodies @var{body1}, @var{body2}, @enddots{}.
|
|
@end deffn
|
|
|
|
@c Local Variables:
|
|
@c TeX-master: "guile.texi"
|
|
@c End:
|