On this page:
begin
begin0
begin-for-syntax

2.15 Sequencing: begin, begin0, and begin-for-syntax

+Sequencing in The Racket Guide introduces begin and begin0.

(begin form ...)
(begin expr ...+)
The first form applies when begin appears at the top level, at module level, or in an internal-definition position (before any expression in the internal-definition sequence). In that case, the begin form is equivalent to splicing the forms into the enclosing context.

The second form applies for begin in an expression position. In that case, the exprs are evaluated in order, and the results are ignored for all but the last expr. The last expr is in tail position with respect to the begin form.

Examples:

> (begin
    (define x 10)
    x)

10

> (+ 1 (begin
         (printf "hi\n")
         2))

hi

3

> (let-values ([(x y) (begin
                        (values 1 2 3)
                        (values 1 2))])
   (list x y))

'(1 2)

(begin0 expr body ...+)
Evaluates the expr, then evaluates the bodys, ignoring the body results. The results of the expr are the results of the begin0 form, but the expr is in tail position only if no bodys are present.

Example:

> (begin0
    (values 1 2)
    (printf "hi\n"))

hi

1

2

(begin-for-syntax form ...)
Allowed only in a top-level context or module context, shifts the phase level of each form by one:

See also module for information about expansion order and partial expansion for begin-for-syntax within a module context. Evaluation of an expr within begin-for-syntax is parameterized to set current-namespace as in let-syntax.