mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
249 lines
6.8 KiB
Text
249 lines
6.8 KiB
Text
@node Guile Scheme concepts
|
|
@chapter Guile Scheme concepts
|
|
|
|
Most Scheme implementations go beyond what is specified in the R4RS
|
|
document @footnote{Remember? R4RS is the Revised^4 report on the
|
|
Algorithmic Language Scheme}, mostly because R4RS does not give
|
|
specifications (or even recommendations) regarding some issues that are
|
|
quite important in practical programming.
|
|
|
|
Here is a list of how Guile implements some of these much-needed Scheme
|
|
extensions; other Scheme implementations do so quite similarly.
|
|
|
|
@menu
|
|
* Scheme slang::
|
|
* Read-eval-print loops::
|
|
* Extra data types::
|
|
* Miscellaneous features::
|
|
@end menu
|
|
|
|
@node Scheme slang
|
|
@section Scheme slang
|
|
@cindex slang
|
|
|
|
Even if you read some of the nice books on Scheme, or the R4RS report,
|
|
you might not find some of the terms frequently used by Scheme hackers,
|
|
both in the manual and in the @url{news:comp.lang.scheme} newsgroup.
|
|
|
|
Here is a glossary of some of the terms that make Scheme beginners and
|
|
intermediate users say ``huh?''
|
|
|
|
@table @strong
|
|
@item thunk
|
|
@cindex thunk
|
|
A Scheme procedure that takes no arguments. In this example,
|
|
@code{thunk} and @code{another-thunk} are both thunks:
|
|
@lisp
|
|
(define (thunk)
|
|
(display "Dude, I'm a thunk!")
|
|
(newline))
|
|
(define another-thunk
|
|
(lambda ()
|
|
(display "Me too!\n")
|
|
(newline)))
|
|
@end lisp
|
|
|
|
@item closure
|
|
@cindex closure
|
|
A closure is a procedure. However, the term emphasizes the fact that a
|
|
Scheme procedure remembers (or @dfn{closes over}) the variables that
|
|
were visible when the @code{lambda} expression was
|
|
evaluated.
|
|
|
|
In the example below, we might refer to @code{q} as a closure, because
|
|
it has closed over the value of @code{x}:
|
|
@lisp
|
|
(define p
|
|
(lambda (x)
|
|
(lambda (y)
|
|
(+ x y))))
|
|
(define q (p 5.7))
|
|
|
|
(q 10)
|
|
@result{} 15.7
|
|
@end lisp
|
|
|
|
However, strictly speaking, every Scheme procedure is really a closure,
|
|
since it closes over the top-level environment.
|
|
|
|
@item alist
|
|
@itemx association list
|
|
|
|
@item plist
|
|
@itemx property list
|
|
|
|
@end table
|
|
|
|
|
|
@node Read-eval-print loops
|
|
@section Read-eval-print loops
|
|
@cindex Read-eval-print loop
|
|
@cindex REPL
|
|
|
|
To explicitly mention the Scheme read-eval-print loop (REPL) seems weird
|
|
because we are all accustomed to firing up an interpreter and having it
|
|
read and execute commands.
|
|
|
|
But the REPL is not specified in R4RS; rather, it is proposed by the
|
|
Scheme Bible @cite{Structure and Interpretation of Computer Programs}
|
|
(also known as @emph{SICP}), and implemented in some form in all Scheme
|
|
interpreters.
|
|
@cindex Structure and Interpretation of Computer Programs
|
|
@cindex SICP
|
|
|
|
[FIXME: Someone needs to tell me what needs to be said about Guile's
|
|
REPL.]
|
|
|
|
@node Extra data types
|
|
@section Extra data types
|
|
|
|
The fundamental Scheme data types specified in R4RS are @emph{numbers}
|
|
(both exact and inexact), @emph{characters}, @emph{strings},
|
|
@emph{symbols}, @emph{vectors}, @emph{pairs} and @emph{lists} [FIXME: is
|
|
this complete?].
|
|
|
|
Many Scheme interpreters offer more types, and Guile is no exception.
|
|
Guile is based on Aubrey Jaffer's SCM interpreter, and thus inherits
|
|
@emph{uniform arrays}, [FIXME: any others? How about records?].
|
|
|
|
On top of that, Guile allows you to add extra types, but that is covered
|
|
in @ref{Adding types to Guile}. Here I will simply document all the
|
|
extra Scheme types shipped with Guile.
|
|
|
|
@menu
|
|
* Conventional arrays::
|
|
* Uniform arrays::
|
|
* Bit vectors::
|
|
* Complex numbers::
|
|
@end menu
|
|
|
|
@node Conventional arrays
|
|
@subsection Conventional arrays
|
|
|
|
@node Uniform arrays
|
|
@subsection Uniform arrays
|
|
@cindex arrays - uniform
|
|
|
|
The motivation for uniform arrays in Scheme is performance. A vector
|
|
provides a performance increase over lists when you want a fixed-size
|
|
indexable list. But the elements in a vector can be of different types,
|
|
and this makes for larger storage requirements and slightly lower
|
|
performance.
|
|
|
|
A uniform array is similar to a vector, but all elements have to be of
|
|
the same type.
|
|
|
|
arrays, uniform arrays, bit vectors:
|
|
|
|
@deffn procedure array-fill ra fill
|
|
@end deffn
|
|
@deffn procedure serial-array-copy! src dst
|
|
@end deffn
|
|
@deffn procedure serial-array-map ra0 proc [lra]
|
|
@end deffn
|
|
@deffn procedure array-map ra0 proc [lra]
|
|
@end deffn
|
|
@deffn procedure array-for-each proc ra0 [lra]
|
|
@end deffn
|
|
@deffn procedure array-index-map! ra proc
|
|
@end deffn
|
|
@deffn procedure array-copy! src dst
|
|
@end deffn
|
|
@deffn procedure array-copy! src dst
|
|
@end deffn
|
|
@deffn procedure array-copy! src dst
|
|
@end deffn
|
|
@deffn procedure array-copy! src dst
|
|
@end deffn
|
|
@deffn procedure array-copy! src dst
|
|
@end deffn
|
|
@deffn procedure array? ra [prot]
|
|
@end deffn
|
|
@deffn procedure array-rank ra
|
|
@end deffn
|
|
@deffn procedure array-dimensions ra
|
|
@end deffn
|
|
@deffn procedure dimensions->uniform-array dims prot fill ...
|
|
@end deffn
|
|
@deffn procedure make-shared-array ra mapfunc dims ...
|
|
@end deffn
|
|
@deffn procedure transpose-array arg ...
|
|
@end deffn
|
|
@deffn procedure enclose-array axes ...
|
|
@end deffn
|
|
@deffn procedure array-in-bounds? arg ...
|
|
@end deffn
|
|
@deffn procedure array-ref ra arg ..
|
|
@end deffn
|
|
@deffn procedure uniform-vector-ref vec pos
|
|
@end deffn
|
|
@deffn procedure array-set! ra obj arg ...
|
|
@end deffn
|
|
@deffn procedure uniform-array-set1! ua obj arg
|
|
@end deffn
|
|
@deffn procedure array-contents ra [strict]
|
|
@end deffn
|
|
@deffn procedure uniform-array-read! ra [port-or-fd] [start] [end]
|
|
@end deffn
|
|
@deffn procedure uniform-array-write! ra [port-or-fd] [start] [end]
|
|
@end deffn
|
|
@deffn procedure bit-count item seq
|
|
@end deffn
|
|
@deffn procedure bit-position item v k
|
|
@end deffn
|
|
@deffn procedure bit-set! v kv obj
|
|
@end deffn
|
|
@deffn procedure bit-count* v kv obj
|
|
@end deffn
|
|
@deffn procedure bit-invert v
|
|
@end deffn
|
|
@deffn procedure array->list ra
|
|
@end deffn
|
|
@deffn procedure list->uniform-array ndim prot list
|
|
@end deffn
|
|
@deffn procedure array-prototype ra
|
|
@end deffn
|
|
|
|
Unform arrays can be written and read, but @code{read} won't recognize
|
|
them unless the optional @code{read-sharp} parameter is supplied,
|
|
e.g,
|
|
@smalllisp
|
|
(read port #t read-sharp)
|
|
@end smalllisp
|
|
|
|
where @code{read-sharp} is the default procedure for parsing extended
|
|
sharp notations.
|
|
|
|
Reading an array is not very efficient at present, since it's implemented
|
|
by reading a list and converting the list to an array.
|
|
|
|
@c FIXME: must use @deftp, but its generation of TeX code is buggy.
|
|
@c Must fix it when TeXinfo gets fixed.
|
|
@deftp {Scheme type} {uniform array}
|
|
|
|
@end deftp
|
|
|
|
@node Bit vectors
|
|
@subsection Bit vectors
|
|
|
|
@node Complex numbers
|
|
@subsection Complex numbers
|
|
|
|
@c FIXME: must use @deftp, but its generation of TeX code is buggy.
|
|
@c Must fix it when TeXinfo gets fixed.
|
|
@deftp {Scheme type} complex
|
|
Standard complex numbers.
|
|
@end deftp
|
|
|
|
@node Miscellaneous features
|
|
@section Miscellaneous features
|
|
|
|
@defun defined? symbol
|
|
Returns @code{#t} if a symbol is bound to a value, @code{#f} otherwise.
|
|
This kind of procedure is not specified in R4RS because @c FIXME: finish
|
|
this thought
|
|
@end defun
|
|
|
|
@defun object-properties OBJ
|
|
and so forth
|
|
@end defun
|