3.17 Procedures
Returns #t if
v is a procedure, #f otherwise.
Applies proc using the content of (list* v ... lst)
as the (by-position) arguments. The #:<kw> kw-arg sequence is
also supplied as keyword arguments to proc, where
#:<kw> stands for any keyword.
The given proc must accept as many arguments as the number of
vs plus length of lst, it must accept the supplied
keyword arguments, and it must not require any other keyword
arguments; otherwise, the exn:fail:contract exception is raised. The given
proc is called in tail position with respect to the
apply call.
Returns a procedure that composes the given functions, applying the last
proc first and the first
proc last. The
compose function
allows the given functions to consume and produce any number of values, as
long as each function produces as many values as the preceding function
consumes, while
compose1 restricts the internal value passing to
a single value. In both cases, the input arity of the last function and
the output arity of the first are unrestricted, and they become the
corresponding arity of the resulting composition (including keyword
arguments for the input side).
When no proc arguments are given, the result is
values. When exactly one is given, it is returned.
Note that in many cases, compose1 is preferred. For example,
using compose with two library functions may lead to problems
when one function is extended to return two values, and the preceding
one has an optional input with different semantics. In addition,
compose1 may create faster compositions.
Returns a procedure that is like
proc, except that its name
as returned by
object-name (and as printed for debugging) is
name.
The given name is used for printing an error message if the
resulting procedure is applied to the wrong number of arguments. In
addition, if proc is an accessor or mutator
produced by struct,
make-struct-field-accessor, or
make-struct-field-mutator, the resulting procedure also uses
name when its (first) argument has the wrong type. More
typically, however, name is not used for reporting errors,
since the procedure name is typically hard-wired into an internal
check.
Returns a procedure that is like
proc except that, when applied
to the wrong number of arguments, the resulting error hides the first
argument as if the procedure had been compiled with the
'method-arity-error syntax property.
3.17.1 Keywords and Arity
Like apply, but kw-lst and kw-val-lst
supply by-keyword arguments in addition to the by-position arguments
of the vs and lst, and in addition to the directly
supplied keyword arguments in the #:<kw> kw-arg sequence,
where #:<kw> stands for any keyword.
The given kw-lst must be sorted using keyword<?. No
keyword can appear twice in kw-lst or in both
kw-list and as a #:<kw>, otherwise, the
exn:fail:contract exception is raised. The given kw-val-lst must have
the same length as kw-lst, otherwise, the
exn:fail:contract exception is raised. The given proc must accept all
of the keywords in kw-lst plus the #:<kw>s, it must
not require any other keywords, and it must accept as many by-position
arguments as supplied via the vs and lst; otherwise,
the exn:fail:contract exception is raised.
Returns information about the number of by-position arguments accepted
by
proc. See also
procedure-arity?.
A valid arity a is one of the following:
An exact non-negative integer, which means that the procedure
accepts a arguments, only.
A arity-at-least instance, which means that the
procedure accepts (arity-at-least-value a) or more
arguments.
A list containing integers and arity-at-least
instances, which means that the procedure accepts any number of
arguments that can match one of the elements of a.
Generally, procedure-arity always produces an arity that is normalized.
Specifically, it is either the empty list (corresponding to the procedure
(case-lambda)), one of the first two cases above, or a list
that contains at least two elements. If it is a list, there is at most one
arity-at-least instance that appears as the last element of the list,
all of the other elements are sorted in ascending order, and there are no duplicate
elements.
Returns #t if the procedure can accept k by-position
arguments, #f otherwise. If kws-ok? is #f,
the result is #t only if proc has no required
keyword arguments.
Returns a procedure that is the same as
proc (including
the same name returned by
object-name), but that accepts
only arguments consistent with
arity. In particular,
when
procedure-arity is applied to the generated
procedure, it returns a value that is
equal? to
arity.
If the arity specification allows arguments that are not in
(procedure-arity proc), the exn:fail:contract exception is raised. If
proc accepts keyword argument, either the keyword arguments
must be all optional (and they are not accepted in by the
arity-reduced procedure) or arity must be the empty list
(which makes a procedure that cannot be called); otherwise, the
exn:fail:contract exception is raised.
Returns information about the keyword arguments required and accepted
by a procedure. The first result is a list of distinct keywords (sorted by
keyword<?) that are required when applying
proc. The
second result is a list of distinct accepted keywords (sorted by
keyword<?), or
#f to mean that any keyword is
accepted. When the second result is a list, every element in the first
list is also in the second list.
When the result is called with keyword arguments, then proc
is called; the first argument is a list of distinct keywords sorted by
keyword<?, the second argument is a parallel list containing a
value for each keyword, and the remaining arguments are the
by-position arguments.
When the result is called without keyword arguments, then
plain-proc is called. Furthermore, procedure-arity
obtains its result from plain-proc.
Examples: |
| > (show 1) | '(() () (1)) | > (show #:init 0 1 2 3 #:extra 4) | '((#:extra #:init) (4 0) (1 2 3)) |
|
Like
procedure-reduce-arity, but constrains the keyword
arguments according to
required-kws and
allowed-kws,
which must be sorted using
keyword<? and contain no duplicates. If
allowed-kws
is
#f, then the resulting procedure still accepts any
keyword, otherwise the keywords in
required-kws must be a
subset of those in
allowed-kws. The original
proc
must require no more keywords than the ones listed in
required-kws, and it must allow at least the keywords in
allowed-kws (or it must allow all keywords if
allowed-kws is
#f).
Examples: |
| | > (show #:init 0 1 2 3 #:extra 4) | '((#:extra #:init) (4 0) (1 2 3)) | > (show 1) | struct ...t/private/kw.rkt:189:14: expects 3 arguments plus | an argument with keyword #:init plus an optional argument | with keyword #:extra, given 1: 1 | > (show #:init 0 1 2 3 #:extra 4 #:more 7) | ...t/private/kw.rkt:189:14: does not expect an argument | with keyword #:more; arguments were: 1 2 3 #:extra 4 #:init | 0 #:more 7 |
|
A
structure type property to identify structure types whose
instances can be applied as procedures. In particular, when
procedure? is applied to the instance, the result will be
#t, and when an instance is used in the function position of
an application expression, a procedure is extracted from the instance
and used to complete the procedure call.
If the prop:procedure property value is an exact non-negative integer, it
designates a field within the structure that should contain a
procedure. The integer must be between 0 (inclusive) and the
number of non-automatic fields in the structure type (exclusive, not
counting supertype fields). The designated field must also be
specified as immutable, so that after an instance of the structure is
created, its procedure cannot be changed. (Otherwise, the arity and
name of the instance could change, and such mutations are generally
not allowed for procedures.) When the instance is used as the
procedure in an application expression, the value of the designated
field in the instance is used to complete the procedure call. (This
procedure can be another structure that acts as a procedure; the
immutability of procedure fields disallows cycles in the procedure
graph, so that the procedure call will eventually continue with a
non-structure procedure.) That procedure receives all of the arguments
from the application expression. The procedure’s name (see
object-name), arity (see procedure-arity), and
keyword protocol (see procedure-keywords) are also used for
the name, arity, and keyword protocol of the structure. If the value
in the designated field is not a procedure, then the instance behaves
like (case-lambda) (i.e., a procedure which does not accept
any number of arguments). See also procedure-extract-target.
Providing an integer proc-spec argument to
make-struct-type is the same as both supplying the value with
the prop:procedure property and designating the field as
immutable (so that a property binding or immutable designation is
redundant and disallowed).
Examples: |
| > (define plus1 (annotated-proc | (lambda (x) (+ x 1)) | "adds 1 to its argument")) |
| > (procedure? plus1) | #t | > (annotated-proc? plus1) | #t | > (plus1 10) | 11 | > (annotated-proc-note plus1) | "adds 1 to its argument" |
|
When the prop:procedure value is a procedure, it should
accept at least one non-keyword argument. When an instance of the
structure is used in an application expression, the property-value
procedure is called with the instance as the first argument. The
remaining arguments to the property-value procedure are the arguments
from the application expression (including keyword arguments). Thus,
if the application expression provides five non-keyword arguments, the
property-value procedure is called with six non-keyword arguments. The
name of the instance (see object-name) and its keyword
protocol (see procedure-keywords) are unaffected by the
property-value procedure, but the instance’s arity is determined by
subtracting one from every possible non-keyword argument count of the
property-value procedure. If the property-value procedure cannot
accept at least one argument, then the instance behaves like
(case-lambda).
Providing a procedure proc-spec argument to
make-struct-type is the same as supplying the value with the
prop:procedure property (so that a specific property binding
is disallowed).
Examples: |
| > (define wanda (fish 12 'red)) | > (fish? wanda) | #t | > (procedure? wanda) | #t | > (fish-weight wanda) | 12 | > (for-each wanda '(1 2 3)) | > (fish-weight wanda) | 18 |
|
If the value supplied for the prop:procedure property is not
an exact non-negative integer or a procedure, the
exn:fail:contract exception is raised.
Returns
#t if instances of the structure type represented by
type are procedures (according to
procedure?),
#f otherwise.
If
proc is an instance of a structure type with property
prop:procedure, and if the property value indicates a field
of the structure, and if the field value is a procedure, then
procedure-extract-target returns the field value. Otherwise,
the result is
#f.
When a prop:procedure property value is a procedure, the
procedure is not returned by
procedure-extract-target. Such a procedure is different from
one accessed through a structure field, because it consumes an extra
argument, which is always the structure that was applied as a
procedure. Keeping the procedure private ensures that is it always
called with a suitable first argument.
A
structure type property that is used for reporting arity-mismatch errors when a
structure type with the
prop:procedure property is applied to
the wrong number of arguments. The value of the
prop:arity-string property must be a procedure that takes a
single argument, which is the misapplied structure, and returns a
string. The result string is used after the word “expects,” and it
is followed in the error message by the number of actual arguments.
Arity-mismatch reporting automatically uses
procedure-extract-target when the prop:arity-string
property is not associated with a procedure structure type.
Examples: |
| | > (pairs 1 2 3 4) | '((1 . 2) (3 . 4)) | > (pairs 5) | #<procedure>: expects an even number of arguments, given 1: | 5 |
|
Extracts a value from
v if it is an instance of
type, which must have the property
prop:checked-procedure. If
v is such an instance,
then the first field of
v is extracted and applied to
v1 and
v2; if the result is a true value, the result
is the value of the second field of
v.
If v is not an instance of type, or if the first
field of v applied to v1 and v2 produces
#f, then proc is applied to v, v1,
and v2, and its result is returned by
checked-procedure-check-and-extract.
3.17.2 Reflecting on Primitives
A primitive procedure is a built-in procedure that is
implemented in low-level language. Not all procedures of
racket/base are primitives, but many are. The
distinction is mainly useful to other low-level code.
Returns #t if v is a primitive procedure,
#f otherwise.
Returns #t if v is internally implemented as a
primitive closure rather than a simple primitive procedure,
#f otherwise.
Returns the arity of the result of the primitive procedure
prim (as opposed to the procedure’s input arity as returned
by
procedure-arity). For most primitives, this procedure
returns
1, since most primitives return a single value when
applied.
3.17.3 Additional Higher-Order Functions
Returns v.
Returns a procedure that accepts any arguments (including keyword
arguments) and returns v.
The
thunk form creates a nullary function that evaluates the
given body. The
thunk* form is similar, except that the
resulting function accepts any arguments (including keyword arguments).
Examples: |
| > (th1) | 1 | > (th1 'x) | procedure th1: expects no arguments, given 1: 'x | > (th1 #:y 'z) | th1: does not accept keyword arguments; arguments were: #:y | 'z | | > (th2) | 1 | > (th2 'x) | 1 | > (th2 #:y 'z) | 1 |
|
Returns a procedure that is just like
proc, except that it
returns the
not of
proc’s result.
Returns a procedure that is a curried version of proc. When
the resulting procedure is first applied, unless it is given the
maximum number of arguments that it can accept, the result is a
procedure to accept additional arguments.
After the first application of the result of curry, each
further application accumulates arguments until an acceptable number
of arguments have been accumulated, at which point the original
proc is called.
A function call (curry proc v ...) is equivalent to
((curry proc) v ...). In other words, curry itself
is curried.
The curry function provides limited support for keyworded
functions: only the curry call itself can receive keyworded
arguments to be propagated eventually to proc.
Like
curry, except that the arguments are collected in the
opposite direction: the first step collects the rightmost group of
arguments, and following steps add arguments to the left of these.