156 lines
6.7 KiB
Racket
156 lines
6.7 KiB
Racket
#lang scribble/doc
|
|
@(require scribble/manual
|
|
"guide-utils.ss")
|
|
|
|
@(define r6rs @elem{R@superscript{6}RS})
|
|
@(define r5rs @elem{R@superscript{5}RS})
|
|
|
|
@title[#:tag "dialects" #:style 'toc]{Dialects of Scheme}
|
|
|
|
PLT Scheme is one dialect of the Scheme programming language, and
|
|
there are many others. Indeed, ``Scheme'' is perhaps more of an idea
|
|
than a specific language.
|
|
|
|
The @hash-lang[] prefix on modules is a particular feature of PLT
|
|
Scheme, and programs that start with @hash-lang[] are unlikely to run
|
|
in other implementations of Scheme. At the same time, programs that do
|
|
not start with @hash-lang[] (or another PLT Scheme module form) do not
|
|
work with the default mode of most PLT Scheme tools.
|
|
|
|
``PLT Scheme'' is not, however, the only dialect of Scheme that is supported
|
|
by PLT Scheme tools. On the contrary, PLT Scheme tools are designed to
|
|
support multiple dialects of Scheme and even multiple languages, which
|
|
allows the PLT Scheme tool suite to serve multiple communities. PLT
|
|
Scheme also gives programmers and researchers the tools they need to
|
|
explore and create new languages.
|
|
|
|
@local-table-of-contents[]
|
|
|
|
@; --------------------------------------------------
|
|
|
|
@section[#:tag "standards"]{Standards}
|
|
|
|
Standard dialects of Scheme include the ones defined by @|r5rs| and
|
|
@|r6rs|.
|
|
|
|
@subsection{@|r5rs|}
|
|
|
|
``@|r5rs|'' stands for @link["../r5rs-std/index.html"]{The
|
|
Revised@superscript{5} Report on the Algorithmic Language Scheme}, and
|
|
it is currently the most widely implemented Scheme standard.
|
|
|
|
PLT Scheme tools in their default modes do not conform to @|r5rs|,
|
|
mainly because PLT Scheme tools generally expect modules, and @|r5rs|
|
|
does not define a module system. Typical single-file @|r5rs| programs
|
|
can be converted to PLT Scheme programs by prefixing them with
|
|
@scheme[@#,hash-lang[] @#,schememodname[r5rs]], but other Scheme
|
|
systems do not recognize @scheme[@#,hash-lang[]
|
|
@#,schememodname[r5rs]]. The @exec{plt-r5rs} executable (see
|
|
@secref[#:doc '(lib "r5rs/r5rs.scrbl") "plt-r5rs"]) more directly
|
|
conforms to the @|r5rs| standard.
|
|
|
|
Aside from the module system, the syntactic forms and functions of
|
|
@|r5rs| and PLT Scheme differ. Only simple @|r5rs| become PLT Scheme
|
|
programs when prefixed with @scheme[@#,hash-lang[] scheme], and
|
|
relatively few PLT Scheme programs become @|r5rs| programs when a
|
|
@hash-lang[] line is removed. Also, when mixing ``@|r5rs| modules''
|
|
with PLT Scheme modules, beware that @|r5rs| pairs correspond to PLT
|
|
Scheme mutable pairs (as constructed with @scheme[mcons]).
|
|
|
|
See @other-manual['(lib "r5rs/r5rs.scrbl")] for more
|
|
information about running @|r5rs| programs with PLT Scheme.
|
|
|
|
@subsection{@|r6rs|}
|
|
|
|
``@|r6rs|'' stands for @link["../r6rs-std/index.html"]{The
|
|
Revised@superscript{6} Report on the Algorithmic Language Scheme},
|
|
which extends @|r5rs| with a module system that is similar to the PLT
|
|
Scheme module system.
|
|
|
|
When an @|r6rs| library or top-level program is prefixed with
|
|
@schememetafont{#!}@schememodname[r6rs] (which is valid @|r6rs|
|
|
syntax), then it can also be used as a PLT Scheme program. This works
|
|
because @schememetafont{#!} in PLT Scheme is treated as a shorthand
|
|
for @hash-lang[] followed by a space, so
|
|
@schememetafont{#!}@schememodname[r6rs] selects the
|
|
@schememodname[r6rs] module language. As with @|r5rs|, however, beware
|
|
that the syntactic forms and functions of @|r6rs| differ from PLT
|
|
Scheme, and @|r6rs| pairs are mutable pairs.
|
|
|
|
See @other-manual['(lib "r6rs/scribblings/r6rs.scrbl")] for more
|
|
information about running @|r6rs| programs with PLT Scheme.
|
|
|
|
@; --------------------------------------------------
|
|
|
|
@section[#:tag "more-hash-lang"]{More PLT Schemes}
|
|
|
|
Like ``Scheme'' itself, even ``PLT Scheme'' is more of an idea about
|
|
programming languages than a language in the usual sense. Macros can
|
|
extend a base language (as described in @secref["macros"]), but macros
|
|
and alternate parsers can construct an entirely new language from the
|
|
ground up.
|
|
|
|
The @hash-lang[] line that starts a PLT Scheme module declares the
|
|
base language of the module. By ``PLT Scheme,'' we usually mean
|
|
@hash-lang[] followed by the base language @schememodname[scheme] or
|
|
@schememodname[scheme/base] (of which @schememodname[scheme] is an
|
|
extension). The PLT Scheme distribution provides additional languages,
|
|
including the following:
|
|
|
|
@itemize[
|
|
|
|
@item{@schememodname[typed-scheme] --- like
|
|
@schememodname[scheme/base], but statically typed; see
|
|
@other-manual['(lib "typed-scheme/ts-guide.scrbl")]}
|
|
|
|
@item{@schememodname[lazy] --- like @schememodname[scheme/base], but
|
|
avoids evaluating an expression until its value is needed; see
|
|
@other-manual['(lib "lazy/lazy.scrbl")]}
|
|
|
|
@item{@schememodname[frtime] --- changes evaluation in an even more
|
|
radical way to support reactive programming; see
|
|
@other-manual['(lib "frtime/scribblings/frtime.scrbl")]}
|
|
|
|
@item{@schememodname[scribble/doc] --- a language, which looks more
|
|
like Latex than Scheme, for writing documentation; see
|
|
@other-manual['(lib "scribblings/scribble/scribble.scrbl")]}
|
|
|
|
]
|
|
|
|
Each of these languages is used by starting module with the language
|
|
name after @hash-lang[]. For example, this source of this
|
|
document starts with @scheme[@#,hash-lang[] scribble/doc].
|
|
|
|
PLT Scheme users can define their own languages. A language name maps
|
|
to its implementation through a module path by adding
|
|
@schemeidfont{/lang/reader}. For example, the language name
|
|
@schememodname[scribble/doc] is expanded to
|
|
@scheme[scribble/doc/lang/reader], which is the module that implements
|
|
the surface-syntax parser. The parser, in turn, generates a
|
|
@scheme[module] form, which determines the base language at the level
|
|
of syntactic forms an functions.
|
|
|
|
Some language names act as language loaders. For example,
|
|
@schememodname[s-exp] as a language uses the usual PLT Scheme parser
|
|
for surface-syntax reading, and then it uses the module path after
|
|
@schememodname[s-exp] for the language's syntactic forms. Thus,
|
|
@scheme[@#,hash-lang[] @#,schememodname[s-exp] "mylang.ss"] parses
|
|
the module body using the normal PLT Scheme reader, by then imports
|
|
the initial syntax and functions for the module body from
|
|
@scheme["mylang.ss"]. Similarly, @scheme[@#,hash-lang[]
|
|
@#,schememodname[planet] _planet-path] loads a language via
|
|
@seclink["top" #:doc '(lib "planet/planet.scrbl")]{@|PLaneT|}.
|
|
|
|
@; --------------------------------------------------
|
|
|
|
@section[#:tag "teaching-langs"]{Teaching}
|
|
|
|
The @|HtDP| textbook relies on pedagogic variants of Scheme that
|
|
smooth the introduction of programming concepts for new programmers.
|
|
The languages are documented in @other-manual['(lib
|
|
"scribblings/htdp-langs/htdp-langs.scrbl")].
|
|
|
|
The @|HtDP| languages are typically not used with @hash-lang[]
|
|
prefixes, but are instead used within DrScheme by selecting the
|
|
language from the @onscreen{Choose Language...} dialog.
|