mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 11:50:28 +02:00
290 lines
9.5 KiB
Text
290 lines
9.5 KiB
Text
@node Introduction
|
|
@chapter Introduction
|
|
|
|
Guile is an interpreter for Scheme, a clean, economical programming
|
|
language in the Lisp family. You can invoke Guile from the shell to
|
|
evaluate Scheme expressions interactively, or use it as an interpreter
|
|
for script files. However, Guile is also packaged as a library, to be
|
|
embedded as an extension language into other applications. The
|
|
application can supplement the base language with special-purpose
|
|
functions and datatypes, allowing the user to customize and extend it by
|
|
writing Scheme code.
|
|
|
|
In its simplest form, Guile is an ordinary interpreter. The
|
|
@code{guile} program can read and evaluate Scheme expressions entered
|
|
from the terminal. Here is a sample interaction between Guile and a
|
|
user; the user's input appears after the @code{$} and @code{guile>}
|
|
prompts:
|
|
|
|
@example
|
|
$ guile
|
|
guile> (+ 1 2 3) ; add some numbers
|
|
6
|
|
guile> (define (factorial n) ; define a function
|
|
(if (zero? n) 1 (* n (factorial (- n 1)))))
|
|
guile> (factorial 20)
|
|
2432902008176640000
|
|
guile> (getpwnam "jimb") ; find my entry in /etc/passwd
|
|
#("jimb" ".0krIpK2VqNbU" 4008 10 "Jim Blandy" "/u/jimb"
|
|
"/usr/local/bin/bash")
|
|
guile> @kbd{C-d}
|
|
$
|
|
@end example
|
|
|
|
Guile can also interpret script files. For example, here is a Guile script
|
|
containing a script which displays the
|
|
|
|
|
|
application can
|
|
supplement the base language with its own functions, datatypes and
|
|
syntax, allowing the user to extend and
|
|
|
|
|
|
Guile interpret
|
|
|
|
. An
|
|
application the Guile interpreter to allow
|
|
|
|
|
|
, allowing
|
|
applications to incorporate the Scheme interpreter for customization
|
|
|
|
[[interactive]]
|
|
[[script interpreter]]
|
|
[[embedded]]
|
|
|
|
[[other languages]]
|
|
The concept of an extension language library does not originate with
|
|
Guile. However, Guile is the first to offer users a choice of languages
|
|
to program in.
|
|
|
|
|
|
Guile currently supports Scheme and Ctax , and we expect to support Emacs Lisp in the near future.
|
|
|
|
|
|
Scheme is powerful enough that other languages can be
|
|
conveniently translated into it,
|
|
|
|
However, unlike other extension packages, Guile gives users a choice of
|
|
languages to program in. Guile can
|
|
|
|
|
|
In this sense, Guile resembles the Tcl and Python packages, providing
|
|
both an ordinary interpreter and an extension language library.
|
|
However, unlike those packages, Guile supports more than one programming
|
|
language.
|
|
|
|
; users can
|
|
write Scheme code to control and customize applications which
|
|
incorporate Guile
|
|
|
|
, adding their own functions,
|
|
datatypes, and syntax, to allow the user to programm
|
|
|
|
|
|
link it into your own programs to make them
|
|
|
|
|
|
|
|
Guile is a library containing an interpreter for Scheme, a complete but
|
|
economical programming language, which the developer can customize to
|
|
suit the application at hand by adding new functions, data types, and
|
|
control structures. These may be implemented in C, and then
|
|
``exported'' for use by the interpreted code. Because Guile already
|
|
provides a full-featured interpreter, the developer need not neglect the
|
|
language's design in order to concentrate on code relevant to the task.
|
|
In this way, Guile provides a framework for the construction of
|
|
domain-specific languages.
|
|
|
|
Guile provides first-class functions, a rich set of data types,
|
|
exception handling, a module system, and a powerful macro facility.
|
|
Guile also supports dynamic linking and direct access to Unix system
|
|
calls. Releases in the near future will support a source-level
|
|
debugger and bindings for the Tk user interface toolkit.
|
|
|
|
|
|
|
|
Guile is a framework for writing applications controlled by specialized
|
|
languages. In its simplest form, Guile is an interpreter for Scheme, a
|
|
clean, economical programming language in the Lisp family. However,
|
|
Guile is packaged as a library, allowing applications to link against it
|
|
and use Scheme as their extension language. The application can add
|
|
primitive functions to the language, implement new data types, and even
|
|
adjust the language's syntax.
|
|
|
|
|
|
|
|
[the introduction is probably not what Jim has in mind; I just took the
|
|
one I had in earlier, since the file had the same name intro.texi]
|
|
|
|
Guile is an implementation of the Scheme programming language, but, like
|
|
other modern implementations of Scheme, it adds many features that the
|
|
community of Scheme programmers considers necessary for an ``industrial
|
|
strength'' language.
|
|
|
|
Examples of extensions to Scheme are the module system
|
|
(@pxref{Modules}), the Unix system programming tools (@pxref{POSIX
|
|
system calls and networking} and @pxref{The Scheme shell (scsh)}), an
|
|
interface to @emph{libtool} to make it easier to add C libraries as
|
|
primitives (@pxref{Linking Guile with your code}), and (FIXME add more).
|
|
|
|
On top of these extensions, which many other Scheme implementations
|
|
provide, Guile also offers the possibility of writing routines in other
|
|
languages and running them simultaneously with Scheme. The desire to
|
|
implement other languages (in particular Emacs Lisp) on top of Scheme is
|
|
responsible for Guile's only deviation from the R4RS @footnote{R4RS is
|
|
the Revised^4 Report on the Algorithmic Language Scheme, the closest
|
|
thing to a standard Scheme specification today} Scheme standard
|
|
(@cite{r4rs}): Guile is case sensitive, whereas ``standard'' Scheme is
|
|
not.
|
|
|
|
But even more fundamentally, Guile is meant to be an @emph{embeddable}
|
|
Scheme interpreter. This means that a lot of work has gone into
|
|
packaging the interpreter as a C library (@pxref{A Portable C to Scheme Interface} and @pxref{Scheme data representation}).
|
|
|
|
This reference manual is mainly driven by the need to document all the
|
|
features that go beyond standard Scheme.
|
|
|
|
@menu
|
|
* Getting started::
|
|
* Guile feature list::
|
|
* What you need to use Guile::
|
|
* Roadmap to the Manual::
|
|
* Motivation for Guile::
|
|
* History of Guile::
|
|
@end menu
|
|
|
|
@node Getting started
|
|
@section Getting started
|
|
|
|
We assume that you know how to program in Scheme, although we do not
|
|
assume advanced knowledge. If you don't know Scheme, there are many
|
|
good books on Scheme at all levels, and the Guile Tutorial might give
|
|
you a good enough feel for the language. We also assume that you know
|
|
how to program in C, since there will be many examples of how to program
|
|
in C using Guile as a library.
|
|
|
|
Many diverse topics from the world of Unix hacking will be covered here,
|
|
such as shared libraries, socket programming, garbage collection, and so
|
|
forth. If at any time you feel you don't have enough background on a
|
|
given topic, just go up a level or two in the manual, and you will find
|
|
that the chapter begins with a few paragraphs that introduce the topic.
|
|
If you are still lost, read through the Guile tutorial and then come
|
|
back to this reference manual.
|
|
|
|
To run the core Guile interpreter and extension library you need no more
|
|
than a basically configured GNU/Unix system and the Guile sources. You
|
|
should download and install the Guile sources (@pxref{Obtaining and
|
|
Installing Guile}).
|
|
|
|
|
|
@node Guile feature list
|
|
@section Guile feature list
|
|
|
|
In a reductionist view, Guile could be regarded as:
|
|
@itemize @bullet
|
|
@item
|
|
An R4RS-compliant Scheme interpreter.
|
|
|
|
@item
|
|
Some Scheme features that go beyond the R4RS standard, notably a module
|
|
system, exception handling primitives and an interface to Aubrey
|
|
Jaffer's SLIB.
|
|
|
|
@item
|
|
A symbolic debugger for Scheme, and gdb extensions to facilitate
|
|
debugging libguile programs.
|
|
|
|
@item
|
|
An embeddable version of the same interpreter, called @emph{libguile}.
|
|
|
|
@item
|
|
A portable high level API on top of libguile (the @code{gh_} interface).
|
|
|
|
@item
|
|
A collection of bundled C libraries with a Guile API. As we write, this
|
|
list includes:
|
|
|
|
@table @strong
|
|
@item Rx
|
|
a regular expression library.
|
|
|
|
@item Unix
|
|
a low-level interface to the POSIX system calls, socket library
|
|
and other Unix system services.
|
|
|
|
@item Tk
|
|
an interface to John Ousterhout's Tk toolkit.
|
|
|
|
@end table
|
|
|
|
@item
|
|
A set of tools for implementing other languages @emph{on top of Scheme},
|
|
and an example implementation of a language called @emph{Ctax}.
|
|
|
|
|
|
@end itemize
|
|
|
|
|
|
@node What you need to use Guile
|
|
@section What you need to use Guile
|
|
|
|
|
|
@node Roadmap to the Manual
|
|
@section Roadmap to the Manual
|
|
|
|
@node Motivation for Guile
|
|
@section Motivation for Guile
|
|
|
|
@node History of Guile
|
|
@section History of Guile
|
|
|
|
@page
|
|
@node Using Guile
|
|
@chapter Using Guile
|
|
|
|
[I think that this might go in the appendix in Jim's view of the manual]
|
|
|
|
@page
|
|
@node Invoking Guile
|
|
@appendix Invoking Guile
|
|
--- mentions read-eval-print loops
|
|
--- both the SCSH and GAWK manuals relegate invocation details
|
|
to an appendix. We can give examples in the introduction.
|
|
|
|
@table @samp
|
|
@item -h
|
|
@itemx --help
|
|
Display a helpful message.
|
|
@item -v
|
|
@item --version
|
|
Display the current version.
|
|
@item --emacs
|
|
To be used for emacs editing support.
|
|
@item -s @var{file}
|
|
Process @var{file} as a script then quit. This is a terminating option:
|
|
any further command line arguments can be accessed by the script using
|
|
the @code{(program-arguments)} procedure.
|
|
|
|
An executable script can start with the following:
|
|
|
|
@smallexample
|
|
#!/usr/bin/guile -s
|
|
!#
|
|
@end smallexample
|
|
|
|
Note the @code{!#} token on the second line. It is very important
|
|
to include this token when writing Guile scripts. Guile and SCSH,
|
|
the Scheme shell, share the convention that @code{#!} and
|
|
@code{!#} may be used to mark block comments (@pxref{Block
|
|
comments and interpreter triggers}). If the closing @code{!#}
|
|
token is not included, then Guile will consider the block comment
|
|
to be unclosed, and the script will probably not compile
|
|
correctly.
|
|
|
|
It is also important to include the @samp{-s} option at the
|
|
beginning of the Guile script, so that Guile knows not to behave
|
|
in an interactive fashion.
|
|
|
|
@end table
|
|
|