92 lines
3.4 KiB
Racket
92 lines
3.4 KiB
Racket
#lang scribble/doc
|
|
@(require scribble/manual scribble/eval "guide-utils.rkt")
|
|
|
|
@title[#:tag "scheme-forms" #:style 'toc]{Expressions and Definitions}
|
|
|
|
The @secref["to-scheme"] chapter introduced some of Racket's syntactic
|
|
forms: definitions, procedure applications, conditionals, and so
|
|
on. This section provides more details on those forms, plus a few
|
|
additional basic forms.
|
|
|
|
@local-table-of-contents[]
|
|
|
|
@section[#:tag "syntax-notation"]{Notation}
|
|
|
|
This chapter (and the rest of the documentation) uses a slightly
|
|
different notation than the character-based grammars of the
|
|
@secref["to-scheme"] chapter. The grammar for a use of a syntactic
|
|
form @racketkeywordfont{something} is shown like this:
|
|
|
|
@specform[(#,(racketkeywordfont "something") [id ...+] an-expr ...)]
|
|
|
|
The italicized meta-variables in this specification, such as
|
|
@racket[_id] and @racket[_an-expr], use the syntax of Racket
|
|
identifiers, so @racket[_an-expr] is one meta-variable. A naming
|
|
convention implicitly defines the meaning of many meta-variables:
|
|
|
|
@itemize[
|
|
|
|
@item{A meta-variable that ends in @racket[_id] stands for an
|
|
identifier, such as @racketidfont{x} or
|
|
@racketidfont{my-favorite-martian}.}
|
|
|
|
@item{A meta-identifier that ends in @racket[_keyword] stands
|
|
for a keyword, such as @racket[#:tag].}
|
|
|
|
@item{A meta-identifier that ends with @racket[_expr] stands for any
|
|
sub-form, and it will be parsed as an expression.}
|
|
|
|
@item{A meta-identifier that ends with @racket[_body] stands for any
|
|
sub-form; it will be parsed as either a local definition or an
|
|
expression. A @racket[_body] can parse as a definition only if
|
|
it is not preceded by any expression, and the last
|
|
@racket[_body] must be an expression; see also @secref["intdefs"].}
|
|
|
|
]
|
|
|
|
Square brackets in the grammar indicate a parenthesized sequence of
|
|
forms, where square brackets are normally used (by convention). That
|
|
is, square brackets @italic{do not} mean optional parts of the
|
|
syntactic form.
|
|
|
|
A @racketmetafont{...} indicates zero or more repetitions of the
|
|
preceding form, and @racketmetafont{...+} indicates one or more
|
|
repetitions of the preceding datum. Otherwise, non-italicized
|
|
identifiers stand for themselves.
|
|
|
|
Based on the above grammar, then, here are a few conforming uses of
|
|
@racketkeywordfont{something}:
|
|
|
|
@racketblock[
|
|
(#,(racketkeywordfont "something") [x])
|
|
(#,(racketkeywordfont "something") [x] (+ 1 2))
|
|
(#,(racketkeywordfont "something") [x my-favorite-martian x] (+ 1 2) #f)
|
|
]
|
|
|
|
Some syntactic-form specifications refer to meta-variables that are
|
|
not implicitly defined and not previously defined. Such meta-variables
|
|
are defined after the main form, using a BNF-like format for
|
|
alternatives:
|
|
|
|
@specform/subs[(#,(racketkeywordfont "something-else") [thing ...+] an-expr ...)
|
|
([thing thing-id
|
|
thing-keyword])]
|
|
|
|
The above example says that, within a @racketkeywordfont{something-else}
|
|
form, a @racket[_thing] is either an identifier or a keyword.
|
|
|
|
@;------------------------------------------------------------------------
|
|
|
|
@include-section["binding.scrbl"]
|
|
@include-section["apply.scrbl"]
|
|
@include-section["lambda.scrbl"]
|
|
@include-section["define.scrbl"]
|
|
@include-section["let.scrbl"]
|
|
@include-section["cond.scrbl"]
|
|
@include-section["begin.scrbl"]
|
|
@include-section["set.scrbl"]
|
|
@include-section["quote.scrbl"]
|
|
@include-section["qq.scrbl"]
|
|
@include-section["case.scrbl"]
|
|
@include-section["parameterize.scrbl"]
|