3.5 Variable References and #%top

► |  | The Racket Reference

1 | Language Model
2 | Notation for Documentation
3 | Syntactic Forms
4 | Datatypes
5 | Structures
6 | Classes and Objects
7 | Units
8 | Contracts
9 | Pattern Matching
10 | Control Flow
11 | Concurrency and Parallelism
12 | Macros
13 | Input and Output
14 | Reflection and Security
15 | Operating System
16 | Memory Management
17 | Unsafe Operations
18 | Running Racket
| Bibliography
| Index

▼ | 3 | Syntactic Forms

3.1 | Modules: module, module*, ...
3.2 | Importing and Exporting: require and provide
3.3 | Literals: quote and #%datum
3.4 | Expression Wrapper: #%expression
3.5 | Variable References and #%top
3.6 | Locations: #%variable-reference
3.7 | Procedure Applications and #%app
3.8 | Procedure Expressions: lambda and case-lambda
3.9 | Local Binding: let, let*, letrec, ...
3.10 | Local Definitions: local
3.11 | Constructing Graphs: shared
3.12 | Conditionals: if, cond, and, and or
3.13 | Dispatch: case
3.14 | Definitions: define, define-syntax, ...
3.15 | Sequencing: begin, begin0, and begin-for-syntax
3.16 | Guarded Evaluation: when and unless
3.17 | Assignment: set! and set!-values
3.18 | Iterations and Comprehensions: for, for/ list, ...
3.19 | Continuation Marks: with-continuation-mark
3.20 | Quasiquoting: quasiquote, unquote, and unquote-splicing
3.21 | Syntax Quoting: quote-syntax
3.22 | Interaction Wrapper: #%top-interaction
3.23 | Blocks: block
3.24 | Internal-Definition Limiting: #%stratified-body
3.25 | Performance Hints: begin-encourage-inline
3.26 | Importing Modules Lazily: lazy-require

On this page:

#%top

top contents ← prev up next →

### 3.5 Variable References and #%top🔗ℹ

> syntax id

Refers to a top-level, module-level, or local binding, when id is not bound as a transformer (see Expansion). At run-time, the reference evaluates to the value in the location associated with the binding.

When the expander encounters an id that is not bound by a module-level or local binding, it converts the expression to (#%top . id) giving #%top the lexical context of the id; typically, that context refers to #%top. See also Expansion Steps.

Examples:

> > (define x 10)
> > x
> 10
> > (let ([x 5]) x)
> 5
> > ((lambda (x) x) 2)
> 2

> syntax (#%top . id)

Equivalent to id when id is bound to a module-level or top-level variable. In a top-level context, (#%top . id) always refers to a top-level variable, even if id is unbound or bound to syntax, as long as id does not have a local binding. In all contexts, (#%top . id) is a syntax error if id has a local binding.

Within a module form, (#%top . id) expands to just id as long as id is defined within the module and has no local binding in its context. At phase level 0, (#%top . id) is an immediate syntax error if id is not bound. At phase level 1 and higher, a syntax error is reported if id is not defined at the corresponding phase by the end of module-body partial expansion.

See also Expansion Steps for information on how the expander introduces #%top identifiers.

Examples:

> > (define x 12)
> > (#%top . x)
> 12

Changed in version 6.3 of package base: Changed the introduction of #%top in a top-level context to unbound identifiers only.
Changed in version 8.2.0.7: Changed treatment of locally bound id to always report a syntax error, even outside of a module.

top contents ← prev up next →