3.14 Definitions: define, define-syntax, ... (original) (raw)
3.14 Definitions: define, define-syntax, ...🔗ℹ
Definitions: define in The Racket Guide introduces definitions.
(define id expr) (define (head args) body ...+) head = id | (head args) args = arg ... arg ... . rest-id arg = arg-id [arg-id default-expr] keyword arg-id keyword [arg-id default-expr]
The first form binds id to the result ofexpr, and the second form binds id to a procedure. In the second case, the generated procedure is(CVT (head args) body ...+), using the CVT meta-function defined as follows:
(CVT (id . kw-formals) . datum) = (lambda kw-formals . datum) (CVT (head . kw-formals) . datum) = (lambda kw-formals expr) if (CVT head . datum) = expr
In an internal-definition context, a define form introduces a local binding; see Internal Definitions. At the top level, the top-level binding for id is created after evaluating expr, if it does not exist already, and the top-level mapping of id (in the namespace linked with the compiled definition) is set to the binding at the same time.
In a context that allows liberal expansion of define,id is bound as syntax if expr is an immediatelambda form with keyword arguments or args include keyword arguments.
Examples:
(define x 10) > x 10 > (f 10) 11 (define ((f x) [y 20]) (+ x y)) > ((f 10) 30) 40 > ((f 10)) 30
(define-values (id ...) expr)
Evaluates the expr, and binds the results to theids, in order, if the number of results matches the number ofids; if expr produces a different number of results, the exn:fail:contract exception is raised.
In an internal-definition context (see Internal Definitions), a define-values form introduces local bindings. At the top level, the top-level binding for each id is created after evaluating expr, if it does not exist already, and the top-level mapping of each id (in thenamespace linked with the compiled definition) is set to the binding at the same time.
Examples:
If a define-values form for a function definition in a module body has a 'compiler-hint:cross-module-inline syntax property with a true value, then the Racket treats the property as a performance hint. SeeFunction-Call Optimizations in The Racket Guide for more information, and see also begin-encourage-inline.
(define-syntax id expr) (define-syntax (head args) body ...+)
The second form is a shorthand the same as for define; it expands to a definition of the first form where the expr is alambda form.
In an internal-definition context (see Internal Definitions), a define-syntax form introduces a local binding.
Examples:
> (foo 1 2 3 4) (1 2 3 4) > (bar 1 2 3 4) (1 2 3 4)
(define-syntaxes (id ...) expr)
Like define-syntax, but creates a transformer binding for each id. The expr should produce as many values as ids, and each value is bound to the correspondingid.
When expr produces zero values for a top-leveldefine-syntaxes (i.e., not in a module or internal-definition position), then the ids are effectively declared without binding; see Macro-Introduced Bindings.
In an internal-definition context (see Internal Definitions), a define-syntaxes form introduces local bindings.
Examples:
> (define-syntaxes (foo1 foo2 foo3) (let ([transformer1 (lambda (syntax-object) (syntax-case syntax-object () [(_) #'1]))] [transformer2 (lambda (syntax-object) (syntax-case syntax-object () [(_) #'2]))] [transformer3 (lambda (syntax-object) (syntax-case syntax-object () [(_) #'3]))]) (values transformer1 transformer2 transformer3))) > (foo1) 1 > (foo2) 2 > (foo3) 3
(define-for-syntax id expr) (define-for-syntax (head args) body ...+)
Within a module, bindings introduced by define-for-syntaxmust appear before their uses or in the samedefine-for-syntax form (i.e., the define-for-syntaxform must be expanded before the use is expanded). In particular, mutually recursive functions bound by define-for-syntax must be defined by the same define-for-syntax form.
Examples:
> (define-for-syntax helper 2) > (define-syntax (make-two syntax-object) (printf "helper is ~a\n" helper) #'2) > (make-two) helper is 2 2 ; ‘helper' is not bound in the runtime phase > helper helper: undefined; cannot reference an identifier before its definition in module: top-level > (let ([a 1] [b 2] [c 3]) (show-variables a 5 2 b c)) '(1 2 3)
(define-values-for-syntax (id ...) expr)
Like define-for-syntax, but expr must produce as many values as supplied ids, and all of the ids are bound (at phase level 1).
Examples:
> (define-values-for-syntax (foo1 foo2) (values 1 2)) > (define-syntax (bar syntax-object) (printf "foo1 is ~a foo2 is ~a\n" foo1 foo2) #'2) > (bar) foo1 is 1 foo2 is 2 2
3.14.1 require Macros🔗ℹ
The bindings documented in this section are provided by the racket/require-syntax library, not racket/base or racket.
(define-require-syntax id proc-expr) (define-require-syntax (id args ...) body ...+)
The first form is like define-syntax, but for arequire sub-form. The proc-expr must produce a procedure that accepts and returns a syntax object representing arequire sub-form.
This form expands to define-syntax with a use ofmake-require-transformer (see require Transformers for more information).
The second form is a shorthand the same as for define-syntax; it expands to a definition of the first form where the proc-expr is alambda form.
Changed in version 6.90.0.29 of package base: Made equivalent to syntax-local-introduce.
3.14.2 provide Macros🔗ℹ
The bindings documented in this section are provided by the racket/provide-syntax library, not racket/base or racket.
(define-provide-syntax id proc-expr) (define-provide-syntax (id args ...) body ...+)
The first form is like define-syntax, but for aprovide sub-form. The proc-expr must produce a procedure that accepts and returns a syntax object representing aprovide sub-form.
This form expands to define-syntax with a use ofmake-provide-transformer (see provide Transformers for more information).
The second form is a shorthand the same as for define-syntax; it expands to a definition of the first form where the expr is alambda form.
Changed in version 6.90.0.29 of package base: Made equivalent to syntax-local-introduce.