mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
Add documentation on embedded procedure properties
* doc/ref/api-procedures.texi (Procedure Properties): Document inline procedure properties.
This commit is contained in:
parent
8b324bef74
commit
305b2fa70c
1 changed files with 60 additions and 37 deletions
|
@ -1,7 +1,7 @@
|
||||||
@c -*-texinfo-*-
|
@c -*-texinfo-*-
|
||||||
@c This is part of the GNU Guile Reference Manual.
|
@c This is part of the GNU Guile Reference Manual.
|
||||||
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2009, 2010,
|
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2009, 2010,
|
||||||
@c 2011, 2012, 2013 Free Software Foundation, Inc.
|
@c 2011, 2012, 2013, 2024 Free Software Foundation, Inc.
|
||||||
@c See the file guile.texi for copying conditions.
|
@c See the file guile.texi for copying conditions.
|
||||||
|
|
||||||
@node Procedures
|
@node Procedures
|
||||||
|
@ -697,11 +697,6 @@ name of a procedure is information not for the procedure, but about
|
||||||
the procedure. This meta-information can be accessed via the procedure
|
the procedure. This meta-information can be accessed via the procedure
|
||||||
properties interface.
|
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?
|
@rnindex procedure?
|
||||||
@deffn {Scheme Procedure} procedure? obj
|
@deffn {Scheme Procedure} procedure? obj
|
||||||
@deffnx {C Function} scm_procedure_p (obj)
|
@deffnx {C Function} scm_procedure_p (obj)
|
||||||
|
@ -711,7 +706,8 @@ Return @code{#t} if @var{obj} is a procedure.
|
||||||
@deffn {Scheme Procedure} thunk? obj
|
@deffn {Scheme Procedure} thunk? obj
|
||||||
@deffnx {C Function} scm_thunk_p (obj)
|
@deffnx {C Function} scm_thunk_p (obj)
|
||||||
Return @code{#t} if @var{obj} is a procedure that can be called with
|
Return @code{#t} if @var{obj} is a procedure that can be called with
|
||||||
zero arguments.
|
zero arguments. @xref{Compiled Procedures}, to get more information
|
||||||
|
on what arguments a procedure will accept.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@cindex procedure properties
|
@cindex procedure properties
|
||||||
|
@ -719,51 +715,78 @@ Procedure properties are general properties associated with
|
||||||
procedures. These can be the name of a procedure or other relevant
|
procedures. These can be the name of a procedure or other relevant
|
||||||
information, such as debug hints.
|
information, such as debug hints.
|
||||||
|
|
||||||
@deffn {Scheme Procedure} procedure-name proc
|
The most general way to associate a property of a procedure is
|
||||||
@deffnx {C Function} scm_procedure_name (proc)
|
programmatically:
|
||||||
Return the name of the procedure @var{proc}
|
|
||||||
|
@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}, or @code{#f} if
|
||||||
|
not found.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@deffn {Scheme Procedure} procedure-source proc
|
@deffn {Scheme Procedure} set-procedure-property! proc key value
|
||||||
@deffnx {C Function} scm_procedure_source (proc)
|
@deffnx {C Function} scm_set_procedure_property_x (proc, key, value)
|
||||||
Return the source of the procedure @var{proc}. Returns @code{#f} if
|
Set @var{proc}'s property named @var{key} to @var{value}.
|
||||||
the source code is not available.
|
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
However, there is a more efficient interface that allows constant
|
||||||
|
properties to be embedded into compiled binaries in a way that does
|
||||||
|
not incur any overhead until someone asks for the property: initial
|
||||||
|
non-tail elements of the body of a lambda expression that are literal
|
||||||
|
vectors of pairs are interpreted as declaring procedure properties.
|
||||||
|
This is easiest to see with an example:
|
||||||
|
|
||||||
|
@example
|
||||||
|
(define proc
|
||||||
|
(lambda args
|
||||||
|
#((a . "hey") (b . "ho")) ;; procedure properties!
|
||||||
|
42))
|
||||||
|
(procedure-property proc 'a) ; @result{} "hey"
|
||||||
|
(procedure-property proc 'b) ; @result{} "ho"
|
||||||
|
@end example
|
||||||
|
|
||||||
|
There is a shorthand for declaring the @code{documentation} property,
|
||||||
|
which is a literal string instead of a literal vector:
|
||||||
|
|
||||||
|
@example
|
||||||
|
(define proc
|
||||||
|
(lambda args
|
||||||
|
"This is a docstring."
|
||||||
|
42))
|
||||||
|
(procedure-property proc 'documentation)
|
||||||
|
;; @result{} "This is a docstring."
|
||||||
|
@end example
|
||||||
|
|
||||||
|
Calling @code{procedure-property} with a key of @code{documentation}
|
||||||
|
is exactly the same as calling @code{procedure-documentation}.
|
||||||
|
Similarly, @code{procedure-name} is the same as the @code{name}
|
||||||
|
procedure property, and @code{procedure-source} is for the
|
||||||
|
@code{source} property.
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} procedure-name proc
|
||||||
|
@deffnx {C Function} scm_procedure_name (proc)
|
||||||
|
@deffnx {Scheme Procedure} procedure-source proc
|
||||||
|
@deffnx {C Function} scm_procedure_source (proc)
|
||||||
|
@deffnx {Scheme Procedure} procedure-documentation proc
|
||||||
|
@deffnx {C Function} scm_procedure_documentation (proc)
|
||||||
|
Return the value of the @code{name}, @code{source}, or
|
||||||
|
@code{documentation} property for @var{proc}, or @code{#f} if no
|
||||||
|
property is set.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
One can also work on the entire set of procedure properties.
|
||||||
|
|
||||||
@deffn {Scheme Procedure} procedure-properties proc
|
@deffn {Scheme Procedure} procedure-properties proc
|
||||||
@deffnx {C Function} scm_procedure_properties (proc)
|
@deffnx {C Function} scm_procedure_properties (proc)
|
||||||
Return the properties associated with @var{proc}, as an association
|
Return the properties associated with @var{proc}, as an association
|
||||||
list.
|
list.
|
||||||
@end deffn
|
@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
|
@deffn {Scheme Procedure} set-procedure-properties! proc alist
|
||||||
@deffnx {C Function} scm_set_procedure_properties_x (proc, alist)
|
@deffnx {C Function} scm_set_procedure_properties_x (proc, alist)
|
||||||
Set @var{proc}'s property list to @var{alist}.
|
Set @var{proc}'s property list to @var{alist}.
|
||||||
@end deffn
|
@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
|
@node Procedures with Setters
|
||||||
@subsection Procedures with Setters
|
@subsection Procedures with Setters
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue