Next: syntaxes new-delete, Previous: syntaxes type-of, Up: syntaxes [Contents][Index]
The following syntactic bindings are exported by the library
(vicare).
Define a new type annotation bound to ?name. The argument ?name must be a syntactic identifier. The argument ?annotation must be a type annotation syntax.
We can define new type annotations using the syntax
define-type:
(define-type <nnfx> <non-negative-fixnum>) (define-type <compound> (or <vector> <list>))
This syntax allows recursive type definitions:
(define-type <it>
(or (list-of <fixnum>)
(vector-of <it>)))
This syntax allows forward definitions: type annotations that are half–defined to allow for mutually recursive type definitions. Here is an example of forward definition that does nothing useful:
(define-type <it>) ;forward definition (define-type <it>) ;does nothing ;;Complete the definition of "<it>". (define-type <it> <number>)
Here is a possible definition for a <syntax-object> type using
mutually recursive definitions:
(import (rename (only (vicare expander)
<stx> <syntactic-identifier>)
(<stx> <wrapped-syntax-object>)))
(define-type <datum>
(or <null> <boolean> <char> <number> <string> <bytevector>))
(define-type <syntax-object>)
(define-type <pair-of-syntax-objects>
(pair-of <syntax-object>))
(define-type <vector-of-syntax-objects>
(vector-of <syntax-object>))
(define-type <syntax-object>
(or <datum>
<wrapped-syntax-object>
<syntactic-identifier>
<pair-of-syntax-objects>
<vector-of-syntax-objects>))
Forward definitions work only for identifiers defined in the same lexical contour. So the following works:
(define-type <it>) (define-type <it> <fixnum>)
but the following will fail:
(define-type <it>)
(module (<it>)
(define-type <it>
<fixnum>))
because the concrete definition is inside a module, which represents a lexical contour.