#reader(lib "docreader.ss" "scribble")
@require[(lib "manual.ss" "scribble")]
@require[(lib "eval.ss" "scribble")]
@require["guide-utils.ss"]

@title{A Guide to PLT Scheme}

This guide is intended for programmers who are new to Scheme, new to PLT
Scheme, or new to some part of PLT Scheme. It definitely assumes some
programming experience. If you are new to programming, consider
instead reading @|HtDP|. If you want a quick and pretty overview of PLT
Scheme, start with @|Quick|. 

@seclink["to-scheme"]{Chapter 2} provides a somewhat gentle
introduction to Scheme. After that, this guide dives into the details
of putting Scheme to work. Even though this guide covers much of the
PLT Scheme toolbox, it leaves precise details to @|MzScheme| and other
reference manuals.

@table-of-contents[]

@include-section["welcome.scrbl"]

@include-section["to-scheme.scrbl"]

@; ----------------------------------------------------------------------
@section[#:tag "datatypes"]{Built-In and Programmer-Defined Datatypes}

We have seen some of Scheme's built-in datatypes, including numbers,
strings, lists, and procedures. This section provides a more complete
coverage of the built-in datatypes, and also introduces the
@scheme[define-struct] form for creating your own datatypes. We defer
a discussion of the class-based object system to @secref["classes"].

...

@; ----------------------------------------------------------------------
@section[#:tag "scheme-read"]{Reading and Printing}

As we mentioned @seclink["syntax-overview"]{before}, the syntax
of a Scheme program is specified in an unusual way. Specifically, it
is defined by two phases:

@itemize{

 @item{a @defterm{read} phase, which parses a stream of characters
       into a tree-structured @defterm{S-expression}; and}

 @item{an @defterm{expand} phase, which parses the S-expression into a
       program.}

}

The second phase is particularly easy to extend, so that Scheme has no
grammar in the traditional sense. At the same time, the first phase is
useful on it's own, and directly available through the @scheme[read]
function. Furthermore, reading of data is naturally matched with
conventions for @defterm{printing} data.

@; ----------------------------------------------------------------------
@section[#:tag "scheme-forms"]{Programs and Expressions}

@subsection{Module Basics}

@subsection{Definition and Expression Forms}

@; ----------------------------------------------------------------------
@section[#:tag "contracts"]{Contracts}

In the reference manual, the documentation for each procedure
describes the acceptable arguments and the result of the procedure
using @idefterm{contracts}.

@; ----------------------------------------------------------------------
@section[#:tag "classes"]{Classes and Objects}


@; ----------------------------------------------------------------------
@section[#:tag "control"]{Exceptions and Control}


@; ----------------------------------------------------------------------
@section[#:tag "threads"]{Threads}


@; ----------------------------------------------------------------------
@section[#:tag "i/o"]{I/O and Networking}


@; ----------------------------------------------------------------------
@section[#:tag "regexp"]{Regular-Expression Matching (Regexps)}


@; ----------------------------------------------------------------------
@section[#:tag "match"]{Pattern Matching}


@; ----------------------------------------------------------------------
@section[#:tag "units"]{Higher-Order Modules (Units)}


@; ----------------------------------------------------------------------
@section[#:tag "macros"]{Syntactic Extension (Modules and Macros)}


@; ----------------------------------------------------------------------
@section[#:tag "reflection"]{Reflection and Dynamic Evaluation}


@; ----------------------------------------------------------------------
@section[#:tag "macros"]{Reader Extension}


@; ----------------------------------------------------------------------
@section[#:tag "security"]{Security}


@; ----------------------------------------------------------------------
@section[#:tag "memory-management"]{Memory Management}


@; ----------------------------------------------------------------------
@section[#:tag "performance"]{Performance}


@; ----------------------------------------------------------------------
@section[#:tag "ffi"]{Foreign-Function Interface (FFI)}


@; ----------------------------------------------------------------------
@section[#:tag "scripts"]{Scripts}


@; ----------------------------------------------------------------------
@section[#:tag "gui"]{Graphical User Interfaces (GUIs)}


@; ----------------------------------------------------------------------
@section[#:tag "tools"]{More Tools}

In the @seclink["intro"]{introduction}, we mentioned that PLT Scheme
includes more tools bsides DrScheme and MzScheme:

@itemize{

 @tool["MrEd"]{extends MzScheme with graphical user interface (GUI)
 and drawing primitives}

 @tool["Setup PLT"]{a command-line tool for installation tasks}

 @tool["planet"]{a command-line tool for managing packages that are
 normally downloaded automatically, on demand}

 @tool["mzc"]{a command-line tool for miscellaneous tasks, such as
 compiling Scheme source, compiling C-implemented extensions to the
 run-time system, generating executables, and building distribution
 packages}

}

@; ----------------------------------------------------------------------

@index-section["guide-index"]
