mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-12 14:50:19 +02:00
* Improve symbol documentation.
* Move variables doc into Modules chapter. * Move Rx doc into Guile Modules part. * Other minor doc changes.
This commit is contained in:
parent
3fd8eb6743
commit
2a946b44f4
6 changed files with 399 additions and 373 deletions
|
@ -1,3 +1,31 @@
|
||||||
|
2001-12-01 Neil Jerram <neil@ossau.uklinux.net>
|
||||||
|
|
||||||
|
* scheme-data.texi (Variables): Node moved to modules chapter.
|
||||||
|
(Symbol Read Syntax): New node, with syntax-related material taken
|
||||||
|
from old Symbols node.
|
||||||
|
(Symbol Primitives): Renamed from `Symbols'.
|
||||||
|
(Symbols and Variables): Renamed to `Symbols'.
|
||||||
|
(Symbol Props): Renamed from `Symbol Tables'.
|
||||||
|
(Symbols): General review, improvements and additional material
|
||||||
|
throughout this section.
|
||||||
|
|
||||||
|
* guile.texi: Updated Notes comment.
|
||||||
|
|
||||||
|
* scheme-data.texi (Rx Interface): Node moved to Guile Modules
|
||||||
|
part, as the Rx interface is not core Guile.
|
||||||
|
|
||||||
|
2001-11-30 Neil Jerram <neil@ossau.uklinux.net>
|
||||||
|
|
||||||
|
* scheme-data.texi (String Miscellanea): Removed, moving doc for
|
||||||
|
string-ci->symbol into the node on Symbols.
|
||||||
|
|
||||||
|
* Makefile.am (ETAGS_ARGS): Added.
|
||||||
|
|
||||||
|
* scheme-data.texi (Symbol Tables): Removed doc for gentemp,
|
||||||
|
intern-symbol, string->obarray-symbol, symbol-binding,
|
||||||
|
symbol-bound?, symbol-set!, unintern-symbol, symbol-interned?; all
|
||||||
|
of which no longer exist.
|
||||||
|
|
||||||
2001-11-25 Thien-Thi Nguyen <ttn@glug.org>
|
2001-11-25 Thien-Thi Nguyen <ttn@glug.org>
|
||||||
|
|
||||||
* posix.texi: Fix spelling. Thanks to Chris Cramer.
|
* posix.texi: Fix spelling. Thanks to Chris Cramer.
|
||||||
|
|
|
@ -34,6 +34,8 @@ guile_TEXINFOS = preface.texi intro.texi program.texi scheme-intro.texi \
|
||||||
debugging.texi indices.texi script-getopt.texi data-rep.texi \
|
debugging.texi indices.texi script-getopt.texi data-rep.texi \
|
||||||
extend.texi repl-modules.texi srfi-modules.texi misc-modules.texi
|
extend.texi repl-modules.texi srfi-modules.texi misc-modules.texi
|
||||||
|
|
||||||
|
ETAGS_ARGS = $(info_TEXINFOS) $(guile_TEXINFOS)
|
||||||
|
|
||||||
# Optionally support building an HTML version of the reference manual.
|
# Optionally support building an HTML version of the reference manual.
|
||||||
|
|
||||||
if HTMLDOC
|
if HTMLDOC
|
||||||
|
|
|
@ -7,18 +7,30 @@
|
||||||
@set MANUAL_EDITION 1.1
|
@set MANUAL_EDITION 1.1
|
||||||
@c %**end of header
|
@c %**end of header
|
||||||
|
|
||||||
@c Notes: (distilled from Jim's and Tim's notes, and kept up to date)
|
@c Notes
|
||||||
@c
|
@c
|
||||||
@c Remember to use "primitive" whereever appropriate.
|
@c We no longer use the category "primitive" to distinguish C-defined
|
||||||
@c FIXME: gotta change existing "subr" uses to "Primitive".
|
@c Scheme procedures from those defined in Scheme. Instead, the
|
||||||
@c [JimB:] In my text for the Guile snarfer, I've used the term "subr"
|
@c reference manual now includes a C declaration as well as a Scheme
|
||||||
@c to denote a C function made available to the Scheme world as a
|
@c declaration for each procedure that is available in both Scheme and
|
||||||
@c function. This terminology is weird, but consistent with the
|
@c C.
|
||||||
@c function names and also with Emacs Lisp, which I assume takes
|
|
||||||
@c Maclisp's lead.
|
|
||||||
@c
|
@c
|
||||||
@c When adding a new function to the Guile manual, please document
|
@c When adding a new reference entry to the Guile manual, please
|
||||||
@c it with @deffn as one of `primitive', `procedure', or `syntax'.
|
@c document it with @deffn using one of the following categories:
|
||||||
|
@c
|
||||||
|
@c {Scheme Procedure}
|
||||||
|
@c {Scheme Syntax}
|
||||||
|
@c {C Function}
|
||||||
|
@c {C Macro}
|
||||||
|
@c
|
||||||
|
@c If the entry is for a new primitive, it should have both a @deffn
|
||||||
|
@c {Scheme Procedure} line and a @deffnx {C Function} line; see the
|
||||||
|
@c manual source for plenty of existing examples of this.
|
||||||
|
@c
|
||||||
|
@c For {C Function} entries where the return type and all parameter
|
||||||
|
@c types are SCM, we omit the SCMs. This is easier to read and also
|
||||||
|
@c gets round the problem that Texinfo doesn't allow a @deftypefnx
|
||||||
|
@c inside a @deffn.
|
||||||
@c
|
@c
|
||||||
@c For a list of Guile primitives that are not yet incorporated into the
|
@c For a list of Guile primitives that are not yet incorporated into the
|
||||||
@c reference manual, see the file `new-docstrings.texi', which holds all
|
@c reference manual, see the file `new-docstrings.texi', which holds all
|
||||||
|
@ -26,8 +38,9 @@
|
||||||
@c that are not in the reference manual. If you have worked with some
|
@c that are not in the reference manual. If you have worked with some
|
||||||
@c of these concepts, implemented them, or just happen to know what they
|
@c of these concepts, implemented them, or just happen to know what they
|
||||||
@c do, please write up a little explanation -- it would be a big help.
|
@c do, please write up a little explanation -- it would be a big help.
|
||||||
@c Alternatively, if you know of a great reason why some of these should
|
@c Alternatively, if you know of any reason why some of these should
|
||||||
@c *not* go in the manual, please let me know.
|
@c *not* go in the manual, please let the mailing list
|
||||||
|
@c <guile-devel@gnu.org> know.
|
||||||
|
|
||||||
@c Define indices that are used in the Guile Scheme part of the
|
@c Define indices that are used in the Guile Scheme part of the
|
||||||
@c reference manual to group stuff according to whether it is R5RS or a
|
@c reference manual to group stuff according to whether it is R5RS or a
|
||||||
|
@ -81,7 +94,7 @@ by the Free Software Foundation.
|
||||||
@sp 10
|
@sp 10
|
||||||
@comment The title is printed in a large font.
|
@comment The title is printed in a large font.
|
||||||
@title Guile Reference Manual
|
@title Guile Reference Manual
|
||||||
@subtitle $Id: guile.texi,v 1.6 2001-11-11 15:01:51 ossau Exp $
|
@subtitle $Id: guile.texi,v 1.7 2001-12-01 15:53:04 ossau Exp $
|
||||||
@subtitle For use with Guile @value{VERSION}
|
@subtitle For use with Guile @value{VERSION}
|
||||||
|
|
||||||
@c AUTHORS
|
@c AUTHORS
|
||||||
|
@ -237,6 +250,7 @@ Part IV: Guile Modules
|
||||||
* Value History:: Maintaining a value history in the REPL.
|
* Value History:: Maintaining a value history in the REPL.
|
||||||
* Pretty Printing:: Nicely formatting Scheme objects for output.
|
* Pretty Printing:: Nicely formatting Scheme objects for output.
|
||||||
* Formatted Output:: The @code{format} procedure.
|
* Formatted Output:: The @code{format} procedure.
|
||||||
|
* Rx Regexps:: The Rx regular expression library.
|
||||||
* Expect:: Controlling interactive programs with Guile.
|
* Expect:: Controlling interactive programs with Guile.
|
||||||
* The Scheme shell (scsh):: Using scsh interfaces in Guile.
|
* The Scheme shell (scsh):: Using scsh interfaces in Guile.
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,7 @@ Guile's object types as the builtin procedures. This is particularly
|
||||||
important for smobs, for which a write procedure can be defined and be
|
important for smobs, for which a write procedure can be defined and be
|
||||||
used by @code{write}, but not by @code{pretty-print}.
|
used by @code{write}, but not by @code{pretty-print}.
|
||||||
|
|
||||||
|
|
||||||
@page
|
@page
|
||||||
@node Formatted Output
|
@node Formatted Output
|
||||||
@chapter Formatted Output
|
@chapter Formatted Output
|
||||||
|
@ -286,6 +287,140 @@ large version of @code{format} by default, so that the start-up time
|
||||||
of the interpreter is not unnecessarily increased.
|
of the interpreter is not unnecessarily increased.
|
||||||
|
|
||||||
|
|
||||||
|
@page
|
||||||
|
@node Rx Regexps
|
||||||
|
@chapter The Rx Regular Expression Library
|
||||||
|
|
||||||
|
[FIXME: this is taken from Gary and Mark's quick summaries and should be
|
||||||
|
reviewed and expanded. Rx is pretty stable, so could already be done!]
|
||||||
|
|
||||||
|
@cindex rx
|
||||||
|
@cindex finite automaton
|
||||||
|
|
||||||
|
The @file{guile-lang-allover} package provides an interface to Tom
|
||||||
|
Lord's Rx library (currently only to POSIX regular expressions). Use of
|
||||||
|
the library requires a two step process: compile a regular expression
|
||||||
|
into an efficient structure, then use the structure in any number of
|
||||||
|
string comparisons.
|
||||||
|
|
||||||
|
For example, given the regular expression @samp{abc.} (which matches any
|
||||||
|
string containing @samp{abc} followed by any single character):
|
||||||
|
|
||||||
|
@smalllisp
|
||||||
|
guile> @kbd{(define r (regcomp "abc."))}
|
||||||
|
guile> @kbd{r}
|
||||||
|
#<rgx abc.>
|
||||||
|
guile> @kbd{(regexec r "abc")}
|
||||||
|
#f
|
||||||
|
guile> @kbd{(regexec r "abcd")}
|
||||||
|
#((0 . 4))
|
||||||
|
guile>
|
||||||
|
@end smalllisp
|
||||||
|
|
||||||
|
The definitions of @code{regcomp} and @code{regexec} are as follows:
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} regcomp pattern [flags]
|
||||||
|
Compile the regular expression pattern using POSIX rules. Flags is
|
||||||
|
optional and should be specified using symbolic names:
|
||||||
|
@defvar REG_EXTENDED
|
||||||
|
use extended POSIX syntax
|
||||||
|
@end defvar
|
||||||
|
@defvar REG_ICASE
|
||||||
|
use case-insensitive matching
|
||||||
|
@end defvar
|
||||||
|
@defvar REG_NEWLINE
|
||||||
|
allow anchors to match after newline characters in the
|
||||||
|
string and prevents @code{.} or @code{[^...]} from matching newlines.
|
||||||
|
@end defvar
|
||||||
|
|
||||||
|
The @code{logior} procedure can be used to combine multiple flags.
|
||||||
|
The default is to use
|
||||||
|
POSIX basic syntax, which makes @code{+} and @code{?} literals and @code{\+}
|
||||||
|
and @code{\?}
|
||||||
|
operators. Backslashes in @var{pattern} must be escaped if specified in a
|
||||||
|
literal string e.g., @code{"\\(a\\)\\?"}.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} regexec regex string [match-pick] [flags]
|
||||||
|
Match @var{string} against the compiled POSIX regular expression
|
||||||
|
@var{regex}.
|
||||||
|
@var{match-pick} and @var{flags} are optional. Possible flags (which can be
|
||||||
|
combined using the logior procedure) are:
|
||||||
|
|
||||||
|
@defvar REG_NOTBOL
|
||||||
|
The beginning of line operator won't match the beginning of
|
||||||
|
@var{string} (presumably because it's not the beginning of a line)
|
||||||
|
@end defvar
|
||||||
|
|
||||||
|
@defvar REG_NOTEOL
|
||||||
|
Similar to REG_NOTBOL, but prevents the end of line operator
|
||||||
|
from matching the end of @var{string}.
|
||||||
|
@end defvar
|
||||||
|
|
||||||
|
If no match is possible, regexec returns #f. Otherwise @var{match-pick}
|
||||||
|
determines the return value:
|
||||||
|
|
||||||
|
@code{#t} or unspecified: a newly-allocated vector is returned,
|
||||||
|
containing pairs with the indices of the matched part of @var{string} and any
|
||||||
|
substrings.
|
||||||
|
|
||||||
|
@code{""}: a list is returned: the first element contains a nested list
|
||||||
|
with the matched part of @var{string} surrounded by the the unmatched parts.
|
||||||
|
Remaining elements are matched substrings (if any). All returned
|
||||||
|
substrings share memory with @var{string}.
|
||||||
|
|
||||||
|
@code{#f}: regexec returns #t if a match is made, otherwise #f.
|
||||||
|
|
||||||
|
vector: the supplied vector is returned, with the first element replaced
|
||||||
|
by a pair containing the indices of the matched portion of @var{string} and
|
||||||
|
further elements replaced by pairs containing the indices of matched
|
||||||
|
substrings (if any).
|
||||||
|
|
||||||
|
list: a list will be returned, with each member of the list
|
||||||
|
specified by a code in the corresponding position of the supplied list:
|
||||||
|
|
||||||
|
a number: the numbered matching substring (0 for the entire match).
|
||||||
|
|
||||||
|
@code{#\<}: the beginning of @var{string} to the beginning of the part matched
|
||||||
|
by regex.
|
||||||
|
|
||||||
|
@code{#\>}: the end of the matched part of @var{string} to the end of
|
||||||
|
@var{string}.
|
||||||
|
|
||||||
|
@code{#\c}: the "final tag", which seems to be associated with the "cut
|
||||||
|
operator", which doesn't seem to be available through the posix
|
||||||
|
interface.
|
||||||
|
|
||||||
|
e.g., @code{(list #\< 0 1 #\>)}. The returned substrings share memory with
|
||||||
|
@var{string}.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
Here are some other procedures that might be used when using regular
|
||||||
|
expressions:
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} compiled-regexp? obj
|
||||||
|
Test whether obj is a compiled regular expression.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} regexp->dfa regex [flags]
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} dfa-fork dfa
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} reset-dfa! dfa
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} dfa-final-tag dfa
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} dfa-continuable? dfa
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} advance-dfa! dfa string
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
@c Local Variables:
|
@c Local Variables:
|
||||||
@c TeX-master: "guile.texi"
|
@c TeX-master: "guile.texi"
|
||||||
@c End:
|
@c End:
|
||||||
|
|
|
@ -47,7 +47,7 @@ sections of this manual that cover them.
|
||||||
* Characters:: New character names.
|
* Characters:: New character names.
|
||||||
* Strings:: Special things about strings.
|
* Strings:: Special things about strings.
|
||||||
* Regular Expressions:: Pattern matching and substitution.
|
* Regular Expressions:: Pattern matching and substitution.
|
||||||
* Symbols and Variables:: Manipulating the Scheme symbol table.
|
* Symbols:: Symbols.
|
||||||
* Keywords:: Self-quoting, customizable display keywords.
|
* Keywords:: Self-quoting, customizable display keywords.
|
||||||
* Pairs:: Scheme's basic building block.
|
* Pairs:: Scheme's basic building block.
|
||||||
* Lists:: Special list functions supported by Guile.
|
* Lists:: Special list functions supported by Guile.
|
||||||
|
@ -1427,7 +1427,6 @@ called with string containing unusal characters.
|
||||||
* String Searching:: Searching in strings.
|
* String Searching:: Searching in strings.
|
||||||
* Alphabetic Case Mapping:: Convert the alphabetic case of strings.
|
* Alphabetic Case Mapping:: Convert the alphabetic case of strings.
|
||||||
* Appending Strings:: Appending strings to form a new string.
|
* Appending Strings:: Appending strings to form a new string.
|
||||||
* String Miscellanea:: Miscellaneous string procedures.
|
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
@node String Syntax
|
@node String Syntax
|
||||||
|
@ -1823,19 +1822,6 @@ concatenation of the given strings, @var{args}.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
@node String Miscellanea
|
|
||||||
@subsection String Miscellanea
|
|
||||||
|
|
||||||
This section contains all remaining string procedures.
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} string-ci->symbol str
|
|
||||||
@deffnx {C Function} scm_string_ci_to_symbol (str)
|
|
||||||
Return the symbol whose name is @var{str}. @var{str} is
|
|
||||||
converted to lowercase before the conversion is done, if Guile
|
|
||||||
is currently reading symbols case-insensitively.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
|
|
||||||
@node Regular Expressions
|
@node Regular Expressions
|
||||||
@section Regular Expressions
|
@section Regular Expressions
|
||||||
@tpindex Regular expressions
|
@tpindex Regular expressions
|
||||||
|
@ -1861,7 +1847,6 @@ installation includes regular expression support by checking whether the
|
||||||
* Regexp Functions:: Functions that create and match regexps.
|
* Regexp Functions:: Functions that create and match regexps.
|
||||||
* Match Structures:: Finding what was matched by a regexp.
|
* Match Structures:: Finding what was matched by a regexp.
|
||||||
* Backslash Escapes:: Removing the special meaning of regexp metacharacters.
|
* Backslash Escapes:: Removing the special meaning of regexp metacharacters.
|
||||||
* Rx Interface:: Tom Lord's Rx library does things differently.
|
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
[FIXME: it may be useful to include an Examples section. Parts of this
|
[FIXME: it may be useful to include an Examples section. Parts of this
|
||||||
|
@ -2173,212 +2158,103 @@ support strings with different quoting conventions (an ungainly and
|
||||||
confusing extension when implemented in other languages), we must adhere
|
confusing extension when implemented in other languages), we must adhere
|
||||||
to this cumbersome escape syntax.
|
to this cumbersome escape syntax.
|
||||||
|
|
||||||
@node Rx Interface
|
|
||||||
@subsection Rx Interface
|
|
||||||
|
|
||||||
@c FIXME::martin: Shouldn't this be removed or moved to the
|
|
||||||
@c ``Guile Modules'' chapter? The functions are not available in
|
|
||||||
@c plain Guile...
|
|
||||||
|
|
||||||
[FIXME: this is taken from Gary and Mark's quick summaries and should be
|
|
||||||
reviewed and expanded. Rx is pretty stable, so could already be done!]
|
|
||||||
|
|
||||||
@cindex rx
|
|
||||||
@cindex finite automaton
|
|
||||||
|
|
||||||
Guile includes an interface to Tom Lord's Rx library (currently only to
|
|
||||||
POSIX regular expressions). Use of the library requires a two step
|
|
||||||
process: compile a regular expression into an efficient structure, then
|
|
||||||
use the structure in any number of string comparisons.
|
|
||||||
|
|
||||||
For example, given the
|
|
||||||
regular expression @samp{abc.} (which matches any string containing
|
|
||||||
@samp{abc} followed by any single character):
|
|
||||||
|
|
||||||
@smalllisp
|
|
||||||
guile> @kbd{(define r (regcomp "abc."))}
|
|
||||||
guile> @kbd{r}
|
|
||||||
#<rgx abc.>
|
|
||||||
guile> @kbd{(regexec r "abc")}
|
|
||||||
#f
|
|
||||||
guile> @kbd{(regexec r "abcd")}
|
|
||||||
#((0 . 4))
|
|
||||||
guile>
|
|
||||||
@end smalllisp
|
|
||||||
|
|
||||||
The definitions of @code{regcomp} and @code{regexec} are as follows:
|
|
||||||
|
|
||||||
@c NJFIXME not in libguile!
|
|
||||||
@deffn {Scheme Procedure} regcomp pattern [flags]
|
|
||||||
Compile the regular expression pattern using POSIX rules. Flags is
|
|
||||||
optional and should be specified using symbolic names:
|
|
||||||
@defvar REG_EXTENDED
|
|
||||||
use extended POSIX syntax
|
|
||||||
@end defvar
|
|
||||||
@defvar REG_ICASE
|
|
||||||
use case-insensitive matching
|
|
||||||
@end defvar
|
|
||||||
@defvar REG_NEWLINE
|
|
||||||
allow anchors to match after newline characters in the
|
|
||||||
string and prevents @code{.} or @code{[^...]} from matching newlines.
|
|
||||||
@end defvar
|
|
||||||
|
|
||||||
The @code{logior} procedure can be used to combine multiple flags.
|
|
||||||
The default is to use
|
|
||||||
POSIX basic syntax, which makes @code{+} and @code{?} literals and @code{\+}
|
|
||||||
and @code{\?}
|
|
||||||
operators. Backslashes in @var{pattern} must be escaped if specified in a
|
|
||||||
literal string e.g., @code{"\\(a\\)\\?"}.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@c NJFIXME not in libguile!
|
|
||||||
@deffn {Scheme Procedure} regexec regex string [match-pick] [flags]
|
|
||||||
|
|
||||||
Match @var{string} against the compiled POSIX regular expression
|
|
||||||
@var{regex}.
|
|
||||||
@var{match-pick} and @var{flags} are optional. Possible flags (which can be
|
|
||||||
combined using the logior procedure) are:
|
|
||||||
|
|
||||||
@defvar REG_NOTBOL
|
|
||||||
The beginning of line operator won't match the beginning of
|
|
||||||
@var{string} (presumably because it's not the beginning of a line)
|
|
||||||
@end defvar
|
|
||||||
|
|
||||||
@defvar REG_NOTEOL
|
|
||||||
Similar to REG_NOTBOL, but prevents the end of line operator
|
|
||||||
from matching the end of @var{string}.
|
|
||||||
@end defvar
|
|
||||||
|
|
||||||
If no match is possible, regexec returns #f. Otherwise @var{match-pick}
|
|
||||||
determines the return value:
|
|
||||||
|
|
||||||
@code{#t} or unspecified: a newly-allocated vector is returned,
|
|
||||||
containing pairs with the indices of the matched part of @var{string} and any
|
|
||||||
substrings.
|
|
||||||
|
|
||||||
@code{""}: a list is returned: the first element contains a nested list
|
|
||||||
with the matched part of @var{string} surrounded by the the unmatched parts.
|
|
||||||
Remaining elements are matched substrings (if any). All returned
|
|
||||||
substrings share memory with @var{string}.
|
|
||||||
|
|
||||||
@code{#f}: regexec returns #t if a match is made, otherwise #f.
|
|
||||||
|
|
||||||
vector: the supplied vector is returned, with the first element replaced
|
|
||||||
by a pair containing the indices of the matched portion of @var{string} and
|
|
||||||
further elements replaced by pairs containing the indices of matched
|
|
||||||
substrings (if any).
|
|
||||||
|
|
||||||
list: a list will be returned, with each member of the list
|
|
||||||
specified by a code in the corresponding position of the supplied list:
|
|
||||||
|
|
||||||
a number: the numbered matching substring (0 for the entire match).
|
|
||||||
|
|
||||||
@code{#\<}: the beginning of @var{string} to the beginning of the part matched
|
|
||||||
by regex.
|
|
||||||
|
|
||||||
@code{#\>}: the end of the matched part of @var{string} to the end of
|
|
||||||
@var{string}.
|
|
||||||
|
|
||||||
@code{#\c}: the "final tag", which seems to be associated with the "cut
|
|
||||||
operator", which doesn't seem to be available through the posix
|
|
||||||
interface.
|
|
||||||
|
|
||||||
e.g., @code{(list #\< 0 1 #\>)}. The returned substrings share memory with
|
|
||||||
@var{string}.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
Here are some other procedures that might be used when using regular
|
|
||||||
expressions:
|
|
||||||
|
|
||||||
@c NJFIXME not in libguile!
|
|
||||||
@deffn {Scheme Procedure} compiled-regexp? obj
|
|
||||||
Test whether obj is a compiled regular expression.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@c NJFIXME not in libguile!
|
|
||||||
@deffn {Scheme Procedure} regexp->dfa regex [flags]
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@c NJFIXME not in libguile!
|
|
||||||
@deffn {Scheme Procedure} dfa-fork dfa
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@c NJFIXME not in libguile!
|
|
||||||
@deffn {Scheme Procedure} reset-dfa! dfa
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@c NJFIXME not in libguile!
|
|
||||||
@deffn {Scheme Procedure} dfa-final-tag dfa
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@c NJFIXME not in libguile!
|
|
||||||
@deffn {Scheme Procedure} dfa-continuable? dfa
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@c NJFIXME not in libguile!
|
|
||||||
@deffn {Scheme Procedure} advance-dfa! dfa string
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
|
|
||||||
@node Symbols and Variables
|
|
||||||
@section Symbols and Variables
|
|
||||||
|
|
||||||
@c FIXME::martin: Review me!
|
|
||||||
|
|
||||||
Symbols are a data type with a special property. On the one hand,
|
|
||||||
symbols are used for denoting variables in a Scheme program, on the
|
|
||||||
other they can be used as literal data as well.
|
|
||||||
|
|
||||||
The association between symbols and values is maintained in special data
|
|
||||||
structures, the symbol tables.
|
|
||||||
|
|
||||||
In addition, Guile offers variables as first-class objects. They can
|
|
||||||
be used for interacting with the module system.
|
|
||||||
|
|
||||||
@menu
|
|
||||||
* Symbols:: All about symbols as a data type.
|
|
||||||
* Symbol Tables:: Tables for mapping symbols to values.
|
|
||||||
* Variables:: First-class variables.
|
|
||||||
@end menu
|
|
||||||
|
|
||||||
@node Symbols
|
@node Symbols
|
||||||
@subsection Symbols
|
@section Symbols
|
||||||
@tpindex Symbols
|
@tpindex Symbols
|
||||||
|
|
||||||
@c FIXME::martin: Review me!
|
Symbols have two main uses. Crucially, they are used for denoting
|
||||||
|
variables in a Scheme program. In addition, they are very useful for
|
||||||
|
describing discrete literal data.
|
||||||
|
|
||||||
Symbols are especially useful because two symbols which are spelled the
|
A symbol is an object with a name that consists of a string of
|
||||||
same way are equivalent in the sense of @code{eq?}. That means that
|
characters. In the usual case (where the name doesn't include any
|
||||||
they are actually the same Scheme object. The advantage is that symbols
|
characters that could be confused with other elements of Scheme syntax)
|
||||||
can be compared extremely efficiently, although they carry more
|
a symbol can be written in a Scheme program by writing the sequence of
|
||||||
information for the human reader than, say, numbers.
|
characters that make up the symbol's name. For example, the read syntax
|
||||||
|
for the symbol named "multiply-by-2" is simply
|
||||||
|
|
||||||
It is very common in Scheme programs to use symbols as keys in
|
@lisp
|
||||||
association lists (@pxref{Association Lists}) or hash tables
|
multiply-by-2
|
||||||
(@pxref{Hash Tables}), because this usage improves the readability a
|
@end lisp
|
||||||
lot, and does not cause any performance loss.
|
|
||||||
|
Symbols, then, look rather like strings but without any quotation marks.
|
||||||
|
But there are several functional differences between them. The first
|
||||||
|
big functional difference between symbols and strings concerns
|
||||||
|
uniqueness. If the same-looking string is read twice from two different
|
||||||
|
places in a program, the result is two @emph{distinguishable} string
|
||||||
|
objects whose contents just happen to be the same. If, on the other
|
||||||
|
hand, the same-looking symbol is read twice from two different places in
|
||||||
|
a program, the result is the @emph{same} symbol object both times.
|
||||||
|
|
||||||
|
@lisp
|
||||||
|
(define str1 "hello")
|
||||||
|
(define str2 "hello")
|
||||||
|
(eq? str1 str2) @result{} #f
|
||||||
|
|
||||||
|
(define sym1 (quote hello))
|
||||||
|
(define sym2 (quote hello))
|
||||||
|
(eq? sym1 sym2) @result{} #t
|
||||||
|
@end lisp
|
||||||
|
|
||||||
|
The second important difference is that symbols, unlike strings, are not
|
||||||
|
self-evaluating. An unquoted symbol is interpreted as a variable
|
||||||
|
reference, and the result of evaluating that symbol is the corresponding
|
||||||
|
variable's value. (By the way, this is why we needed the @code{(quote
|
||||||
|
@dots{})}s in the example above: @code{(quote hello)} returns the symbol
|
||||||
|
object named "hello" itself, whereas an unquoted @code{hello} would try
|
||||||
|
to find and dereference a variable associated with that symbol.)
|
||||||
|
|
||||||
|
For example, when the expression @code{(string-length "abcd")} is read
|
||||||
|
and evaluated, the sequence of characters @code{string-length} is read
|
||||||
|
as the symbol whose name is "string-length". This symbol is associated
|
||||||
|
with a variable whose value is the procedure that implements string
|
||||||
|
length calculation. Therefore evaluation of the @code{string-length}
|
||||||
|
symbol results in that procedure.
|
||||||
|
|
||||||
|
Although the use of symbols for variable references is undoubtedly their
|
||||||
|
most important role in Scheme, it is not documented further here. See
|
||||||
|
instead @ref{Binding Constructs}, for how associations between symbols
|
||||||
|
and variables are created, and @ref{Modules}, for how those associations
|
||||||
|
are affected by Guile's module system. The rest of this section
|
||||||
|
explains how symbols can also be used to represent discrete values, and
|
||||||
|
documents the procedures available that relate to symbols as data
|
||||||
|
objects @i{per se}.
|
||||||
|
|
||||||
|
@menu
|
||||||
|
* Symbol Read Syntax:: Extended read syntax for symbols.
|
||||||
|
* Symbol Primitives:: Operations related to symbols.
|
||||||
|
* Symbol Discrete:: Using symbols as discrete values.
|
||||||
|
* Symbol Props:: Function slots and property lists.
|
||||||
|
@end menu
|
||||||
|
|
||||||
|
|
||||||
|
@node Symbol Read Syntax
|
||||||
|
@subsection Extended Read Syntax for Symbols
|
||||||
|
|
||||||
The read syntax for symbols is a sequence of letters, digits, and
|
The read syntax for symbols is a sequence of letters, digits, and
|
||||||
@dfn{extended alphabetic characters} that begins with a character that
|
@dfn{extended alphabetic characters}, beginning with a character that
|
||||||
cannot begin a number is an identifier. In addition, @code{+},
|
cannot begin a number. In addition, the special cases of @code{+},
|
||||||
@code{-}, and @code{...} are identifiers.
|
@code{-}, and @code{...} are read as symbols even though numbers can
|
||||||
|
begin with @code{+}, @code{-} or @code{.}.
|
||||||
|
|
||||||
Extended alphabetic characters may be used within identifiers as if
|
Extended alphabetic characters may be used within identifiers as if
|
||||||
they were letters. The following are extended alphabetic characters:
|
they were letters. The set of extended alphabetic characters is:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
! $ % & * + - . / : < = > ? @@ ^ _ ~
|
! $ % & * + - . / : < = > ? @@ ^ _ ~
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
In addition to the read syntax defined above (which is taken from R5RS
|
In addition to the standard read syntax defined above (which is taken
|
||||||
(@pxref{Formal syntax,,,r5rs,The Revised^5 Report on Scheme})), Guile
|
from R5RS (@pxref{Formal syntax,,,r5rs,The Revised^5 Report on
|
||||||
provides a method for writing symbols with unusual characters, such as
|
Scheme})), Guile provides an extended symbol read syntax that allows the
|
||||||
space characters. If you (for whatever reason) need to write a symbol
|
inclusion of unusual characters such as space characters, newlines and
|
||||||
containing characters not mentioned above, you write symbols as follows:
|
parentheses. If (for whatever reason) you need to write a symbol
|
||||||
|
containing characters not mentioned above, you can do so as follows.
|
||||||
|
|
||||||
@itemize @bullet
|
@itemize @bullet
|
||||||
@item
|
@item
|
||||||
Begin the symbol with the two character @code{#@{},
|
Begin the symbol with the characters @code{#@{},
|
||||||
|
|
||||||
@item
|
@item
|
||||||
write the characters of the symbol and
|
write the characters of the symbol and
|
||||||
|
@ -2387,19 +2263,27 @@ write the characters of the symbol and
|
||||||
finish the symbol with the characters @code{@}#}.
|
finish the symbol with the characters @code{@}#}.
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
Here are a few examples of this form of read syntax; the first
|
Here are a few examples of this form of read syntax. The first symbol
|
||||||
containing a space character, the second containing a line break and the
|
needs to use extended syntax because it contains a space character, the
|
||||||
last one looks like a number.
|
second because it contains a line break, and the last because it looks
|
||||||
|
like a number.
|
||||||
|
|
||||||
@lisp
|
@lisp
|
||||||
#@{foo bar@}#
|
#@{foo bar@}#
|
||||||
|
|
||||||
#@{what
|
#@{what
|
||||||
ever@}#
|
ever@}#
|
||||||
|
|
||||||
#@{4242@}#
|
#@{4242@}#
|
||||||
@end lisp
|
@end lisp
|
||||||
|
|
||||||
Usage of this form of read syntax is discouraged, because it is not
|
Although Guile provides this extended read syntax for symbols,
|
||||||
portable at all, and is not very readable.
|
widespread usage of it is discouraged because it is not portable and not
|
||||||
|
very readable.
|
||||||
|
|
||||||
|
|
||||||
|
@node Symbol Primitives
|
||||||
|
@subsection Operations Related to Symbols
|
||||||
|
|
||||||
@rnindex symbol?
|
@rnindex symbol?
|
||||||
@deffn {Scheme Procedure} symbol? obj
|
@deffn {Scheme Procedure} symbol? obj
|
||||||
|
@ -2433,6 +2317,13 @@ standard case is lower case:
|
||||||
@end lisp
|
@end lisp
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} string-ci->symbol str
|
||||||
|
@deffnx {C Function} scm_string_ci_to_symbol (str)
|
||||||
|
Return the symbol whose name is @var{str}. @var{str} is
|
||||||
|
converted to lowercase before the conversion is done, if Guile
|
||||||
|
is currently reading symbols case-insensitively.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
@rnindex symbol->string
|
@rnindex symbol->string
|
||||||
@deffn {Scheme Procedure} symbol->string s
|
@deffn {Scheme Procedure} symbol->string s
|
||||||
@deffnx {C Function} scm_symbol_to_string (s)
|
@deffnx {C Function} scm_symbol_to_string (s)
|
||||||
|
@ -2461,19 +2352,10 @@ standard case is lower case:
|
||||||
@end lisp
|
@end lisp
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@node Symbol Tables
|
@deffn {Scheme Procedure} symbol-hash symbol
|
||||||
@subsection Symbol Tables
|
@deffnx {C Function} scm_symbol_hash (symbol)
|
||||||
|
Return a hash value for @var{symbol}.
|
||||||
@c FIXME::martin: Review me!
|
@end deffn
|
||||||
|
|
||||||
@c FIXME::martin: Are all these procedures still relevant?
|
|
||||||
|
|
||||||
Guile symbol tables are hash tables. Each hash table, also called an
|
|
||||||
@dfn{obarray} (for `object array'), is a vector of association lists.
|
|
||||||
Each entry in the alists is a pair (@var{SYMBOL} . @var{VALUE}). To
|
|
||||||
@dfn{intern} a symbol in a symbol table means to return its
|
|
||||||
(@var{SYMBOL} . @var{VALUE}) pair, adding a new entry to the symbol
|
|
||||||
table (with an undefined value) if none is yet present.
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} gensym [prefix]
|
@deffn {Scheme Procedure} gensym [prefix]
|
||||||
@deffnx {C Function} scm_gensym (prefix)
|
@deffnx {C Function} scm_gensym (prefix)
|
||||||
|
@ -2484,42 +2366,24 @@ is increased by 1 at each call. There is no provision for
|
||||||
resetting the counter.
|
resetting the counter.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@deffn {Scheme Procedure} gentemp [prefix [obarray]]
|
|
||||||
Create a new symbol with a name unique in an obarray.
|
|
||||||
The name is constructed from an optional string @var{prefix}
|
|
||||||
and a counter value. The default prefix is @code{t}. The
|
|
||||||
@var{obarray} is specified as a second optional argument.
|
|
||||||
Default is the system obarray where all normal symbols are
|
|
||||||
interned. The counter is increased by 1 at each
|
|
||||||
call. There is no provision for resetting the counter.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} intern-symbol obarray string
|
@node Symbol Discrete
|
||||||
Add a new symbol to @var{obarray} with name @var{string}, bound to an
|
@subsection Using Symbols as Discrete Values
|
||||||
unspecified initial value. The symbol table is not modified if a symbol
|
|
||||||
with this name is already present.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} string->obarray-symbol obarray string [soft?]
|
Symbols are especially useful because two symbols which are spelled the
|
||||||
Intern a new symbol in @var{obarray}, a symbol table, with name
|
same way are equivalent in the sense of @code{eq?}. That means that
|
||||||
@var{string}.
|
they are actually the same Scheme object. The advantage is that symbols
|
||||||
@end deffn
|
can be compared extremely efficiently, although they carry more
|
||||||
|
information for the human reader than, say, numbers.
|
||||||
|
|
||||||
@deffn {Scheme Procedure} symbol-binding obarray string
|
It is very common in Scheme programs to use symbols as keys in
|
||||||
Look up in @var{obarray} the symbol whose name is @var{string}, and
|
association lists (@pxref{Association Lists}) or hash tables
|
||||||
return the value to which it is bound. If @var{obarray} is @code{#f},
|
(@pxref{Hash Tables}), because this usage improves the readability a
|
||||||
use the global symbol table. If @var{string} is not interned in
|
lot, and does not cause any performance loss.
|
||||||
@var{obarray}, an error is signalled.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} symbol-bound? obarray string
|
|
||||||
Return @code{#t} if @var{obarray} contains a symbol with name
|
@node Symbol Props
|
||||||
@var{string} bound to a defined value. This differs from
|
@subsection Function Slots and Property Lists
|
||||||
@var{symbol-interned?} in that the mere mention of a symbol
|
|
||||||
usually causes it to be interned; @code{symbol-bound?}
|
|
||||||
determines whether a symbol has been given any meaningful
|
|
||||||
value.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} symbol-fref symbol
|
@deffn {Scheme Procedure} symbol-fref symbol
|
||||||
@deffnx {C Function} scm_symbol_fref (symbol)
|
@deffnx {C Function} scm_symbol_fref (symbol)
|
||||||
|
@ -2531,16 +2395,6 @@ Return the contents of @var{symbol}'s @dfn{function slot}.
|
||||||
Change the binding of @var{symbol}'s function slot.
|
Change the binding of @var{symbol}'s function slot.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@deffn {Scheme Procedure} symbol-hash symbol
|
|
||||||
@deffnx {C Function} scm_symbol_hash (symbol)
|
|
||||||
Return a hash value for @var{symbol}.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} symbol-interned? obarray string
|
|
||||||
Return @code{#t} if @var{obarray} contains a symbol with name
|
|
||||||
@var{string}, and @code{#f} otherwise.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} symbol-pref symbol
|
@deffn {Scheme Procedure} symbol-pref symbol
|
||||||
@deffnx {C Function} scm_symbol_pref (symbol)
|
@deffnx {C Function} scm_symbol_pref (symbol)
|
||||||
Return the @dfn{property list} currently associated with @var{symbol}.
|
Return the @dfn{property list} currently associated with @var{symbol}.
|
||||||
|
@ -2551,95 +2405,6 @@ Return the @dfn{property list} currently associated with @var{symbol}.
|
||||||
Change the binding of @var{symbol}'s property slot.
|
Change the binding of @var{symbol}'s property slot.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@deffn {Scheme Procedure} symbol-set! obarray string value
|
|
||||||
Find the symbol in @var{obarray} whose name is @var{string}, and rebind
|
|
||||||
it to @var{value}. An error is signalled if @var{string} is not present
|
|
||||||
in @var{obarray}.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} unintern-symbol obarray string
|
|
||||||
Remove the symbol with name @var{string} from @var{obarray}. This
|
|
||||||
function returns @code{#t} if the symbol was present and @code{#f}
|
|
||||||
otherwise.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
|
|
||||||
@node Variables
|
|
||||||
@subsection Variables
|
|
||||||
@tpindex Variables
|
|
||||||
|
|
||||||
A variable is a box-like object that can hold any Scheme value. It is
|
|
||||||
said to be @dfn{undefined} if its box holds a special Scheme value that
|
|
||||||
denotes undefined-ness (which is different from all other Scheme values,
|
|
||||||
including for example @code{#f}); otherwise the variable is
|
|
||||||
@dfn{defined}.
|
|
||||||
|
|
||||||
On its own, a variable object is anonymous. A variable is said to be
|
|
||||||
@dfn{bound} when it is associated with a name in some way, usually a
|
|
||||||
symbol in a module obarray. When this happens, the relationship is
|
|
||||||
mutual: the variable is bound to the name (in that module), and the name
|
|
||||||
(in that module) is bound to the variable.
|
|
||||||
|
|
||||||
(That's the theory, anyway. In practice, defined-ness and bound-ness
|
|
||||||
sometimes get confused, because Lisp and Scheme implementations have
|
|
||||||
often conflated --- or deliberately drawn no distinction between --- a
|
|
||||||
name that is unbound and a name that is bound to a variable whose value
|
|
||||||
is undefined. We will try to be clear about the difference and explain
|
|
||||||
any confusion where it is unavoidable.)
|
|
||||||
|
|
||||||
Variables do not have a read syntax. Most commonly they are created and
|
|
||||||
bound implicitly by @code{define} expressions: a top-level @code{define}
|
|
||||||
expression of the form
|
|
||||||
|
|
||||||
@lisp
|
|
||||||
(define @var{name} @var{value})
|
|
||||||
@end lisp
|
|
||||||
|
|
||||||
@noindent
|
|
||||||
creates a variable with initial value @var{value} and binds it to the
|
|
||||||
name @var{name} in the current module. But they can also be created
|
|
||||||
dynamically by calling one of the constructor procedures
|
|
||||||
@code{make-variable} and @code{make-undefined-variable}.
|
|
||||||
|
|
||||||
First-class variables are especially useful for interacting with the
|
|
||||||
current module system (@pxref{The Guile module system}).
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} make-undefined-variable
|
|
||||||
@deffnx {C Function} scm_make_undefined_variable ()
|
|
||||||
Return a variable that is initially unbound.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} make-variable init
|
|
||||||
@deffnx {C Function} scm_make_variable (init)
|
|
||||||
Return a variable initialized to value @var{init}.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} variable-bound? var
|
|
||||||
@deffnx {C Function} scm_variable_bound_p (var)
|
|
||||||
Return @code{#t} iff @var{var} is bound to a value.
|
|
||||||
Throws an error if @var{var} is not a variable object.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} variable-ref var
|
|
||||||
@deffnx {C Function} scm_variable_ref (var)
|
|
||||||
Dereference @var{var} and return its value.
|
|
||||||
@var{var} must be a variable object; see @code{make-variable}
|
|
||||||
and @code{make-undefined-variable}.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} variable-set! var val
|
|
||||||
@deffnx {C Function} scm_variable_set_x (var, val)
|
|
||||||
Set the value of the variable @var{var} to @var{val}.
|
|
||||||
@var{var} must be a variable object, @var{val} can be any
|
|
||||||
value. Return an unspecified value.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@deffn {Scheme Procedure} variable? obj
|
|
||||||
@deffnx {C Function} scm_variable_p (obj)
|
|
||||||
Return @code{#t} iff @var{obj} is a variable object, else
|
|
||||||
return @code{#f}.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
|
|
||||||
@node Keywords
|
@node Keywords
|
||||||
@section Keywords
|
@section Keywords
|
||||||
|
@ -2777,8 +2542,8 @@ Or, even more economically, like this:
|
||||||
@end lisp
|
@end lisp
|
||||||
|
|
||||||
For further details on @code{let-keywords}, @code{define*} and other
|
For further details on @code{let-keywords}, @code{define*} and other
|
||||||
facilities provided by the @code{(ice-9 optargs)} module, @ref{Optional
|
facilities provided by the @code{(ice-9 optargs)} module, see
|
||||||
Arguments}.
|
@ref{Optional Arguments}.
|
||||||
|
|
||||||
|
|
||||||
@node Keyword Read Syntax
|
@node Keyword Read Syntax
|
||||||
|
@ -2786,10 +2551,11 @@ Arguments}.
|
||||||
|
|
||||||
Guile, by default, only recognizes the keyword syntax specified by R5RS.
|
Guile, by default, only recognizes the keyword syntax specified by R5RS.
|
||||||
A token of the form @code{#:NAME}, where @code{NAME} has the same syntax
|
A token of the form @code{#:NAME}, where @code{NAME} has the same syntax
|
||||||
as a Scheme symbol, is the external representation of the keyword named
|
as a Scheme symbol (@pxref{Symbol Read Syntax}), is the external
|
||||||
@code{NAME}. Keyword objects print using this syntax as well, so values
|
representation of the keyword named @code{NAME}. Keyword objects print
|
||||||
containing keyword objects can be read back into Guile. When used in an
|
using this syntax as well, so values containing keyword objects can be
|
||||||
expression, keywords are self-quoting objects.
|
read back into Guile. When used in an expression, keywords are
|
||||||
|
self-quoting objects.
|
||||||
|
|
||||||
If the @code{keyword} read option is set to @code{'prefix}, Guile also
|
If the @code{keyword} read option is set to @code{'prefix}, Guile also
|
||||||
recognizes the alternative read syntax @code{:NAME}. Otherwise, tokens
|
recognizes the alternative read syntax @code{:NAME}. Otherwise, tokens
|
||||||
|
@ -2817,7 +2583,7 @@ interface} and @ref{Reader options}.
|
||||||
#:type
|
#:type
|
||||||
|
|
||||||
:type
|
:type
|
||||||
@result{}
|
@print{}
|
||||||
ERROR: In expression :type:
|
ERROR: In expression :type:
|
||||||
ERROR: Unbound variable: :type
|
ERROR: Unbound variable: :type
|
||||||
ABORT: (unbound-variable)
|
ABORT: (unbound-variable)
|
||||||
|
|
|
@ -32,10 +32,14 @@ designed languages: ML, Python, Perl, and Modula 3 all allow the
|
||||||
clutter the global name space.
|
clutter the global name space.
|
||||||
@cindex name space - private
|
@cindex name space - private
|
||||||
|
|
||||||
|
In addition, Guile offers variables as first-class objects. They can
|
||||||
|
be used for interacting with the module system.
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Scheme and modules:: How modules are handled in standard Scheme.
|
* Scheme and modules:: How modules are handled in standard Scheme.
|
||||||
* The Guile module system:: How Guile does it.
|
* The Guile module system:: How Guile does it.
|
||||||
* Dynamic Libraries:: Loading libraries of compiled code at run time.
|
* Dynamic Libraries:: Loading libraries of compiled code at run time.
|
||||||
|
* Variables:: First-class variables.
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
|
|
||||||
|
@ -827,6 +831,83 @@ the same place on all machines (which seems like a good idea to me
|
||||||
anyway).
|
anyway).
|
||||||
|
|
||||||
|
|
||||||
|
@node Variables
|
||||||
|
@section Variables
|
||||||
|
@tpindex Variables
|
||||||
|
|
||||||
|
A variable is a box-like object that can hold any Scheme value. It is
|
||||||
|
said to be @dfn{undefined} if its box holds a special Scheme value that
|
||||||
|
denotes undefined-ness (which is different from all other Scheme values,
|
||||||
|
including for example @code{#f}); otherwise the variable is
|
||||||
|
@dfn{defined}.
|
||||||
|
|
||||||
|
On its own, a variable object is anonymous. A variable is said to be
|
||||||
|
@dfn{bound} when it is associated with a name in some way, usually a
|
||||||
|
symbol in a module obarray. When this happens, the relationship is
|
||||||
|
mutual: the variable is bound to the name (in that module), and the name
|
||||||
|
(in that module) is bound to the variable.
|
||||||
|
|
||||||
|
(That's the theory, anyway. In practice, defined-ness and bound-ness
|
||||||
|
sometimes get confused, because Lisp and Scheme implementations have
|
||||||
|
often conflated --- or deliberately drawn no distinction between --- a
|
||||||
|
name that is unbound and a name that is bound to a variable whose value
|
||||||
|
is undefined. We will try to be clear about the difference and explain
|
||||||
|
any confusion where it is unavoidable.)
|
||||||
|
|
||||||
|
Variables do not have a read syntax. Most commonly they are created and
|
||||||
|
bound implicitly by @code{define} expressions: a top-level @code{define}
|
||||||
|
expression of the form
|
||||||
|
|
||||||
|
@lisp
|
||||||
|
(define @var{name} @var{value})
|
||||||
|
@end lisp
|
||||||
|
|
||||||
|
@noindent
|
||||||
|
creates a variable with initial value @var{value} and binds it to the
|
||||||
|
name @var{name} in the current module. But they can also be created
|
||||||
|
dynamically by calling one of the constructor procedures
|
||||||
|
@code{make-variable} and @code{make-undefined-variable}.
|
||||||
|
|
||||||
|
First-class variables are especially useful for interacting with the
|
||||||
|
current module system (@pxref{The Guile module system}).
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} make-undefined-variable
|
||||||
|
@deffnx {C Function} scm_make_undefined_variable ()
|
||||||
|
Return a variable that is initially unbound.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} make-variable init
|
||||||
|
@deffnx {C Function} scm_make_variable (init)
|
||||||
|
Return a variable initialized to value @var{init}.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} variable-bound? var
|
||||||
|
@deffnx {C Function} scm_variable_bound_p (var)
|
||||||
|
Return @code{#t} iff @var{var} is bound to a value.
|
||||||
|
Throws an error if @var{var} is not a variable object.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} variable-ref var
|
||||||
|
@deffnx {C Function} scm_variable_ref (var)
|
||||||
|
Dereference @var{var} and return its value.
|
||||||
|
@var{var} must be a variable object; see @code{make-variable}
|
||||||
|
and @code{make-undefined-variable}.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} variable-set! var val
|
||||||
|
@deffnx {C Function} scm_variable_set_x (var, val)
|
||||||
|
Set the value of the variable @var{var} to @var{val}.
|
||||||
|
@var{var} must be a variable object, @var{val} can be any
|
||||||
|
value. Return an unspecified value.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} variable? obj
|
||||||
|
@deffnx {C Function} scm_variable_p (obj)
|
||||||
|
Return @code{#t} iff @var{obj} is a variable object, else
|
||||||
|
return @code{#f}.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
@c Local Variables:
|
@c Local Variables:
|
||||||
@c TeX-master: "guile.texi"
|
@c TeX-master: "guile.texi"
|
||||||
@c End:
|
@c End:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue