More Syntax Classes
This library provides additional syntax classes for use with syntax/parse.
1 Locally bound transformer bindings
(require syntax/parse/class/local-value) | |
package: syntax-classes-lib |
syntax class
(local-value [predicate?] [intdef-ctx] [#:failure-message failure-message])
predicate? : (-> any/c any/c) = (const #t)
intdef-ctx : (or/c internal-definition-context? (listof internal-definition-context?) #f) = #f
failure-message : (or/c string? #f) = #f
If predicate? is specified, then predicate? will be applied to the result of syntax-local-value, and if the result is #f, then the syntax class will fail to match.
If intdef-ctx is not #f, bindings from all provided definition contexts are considered when determining the local binding. Like the third argument to syntax-local-value, the scopes associated with the provided definition contexts are not used to enrich the matching identifier’s lexical information.
If the identifier is not bound to a transformer binding, or if the binding does not satisfy predicate?, then failure-message will be used as the error message, if it is supplied.
> (define-syntax print-local (syntax-parser [(_ id:local-value) (println (attribute id.local-value)) #'(void)])) > (define-syntax something 42) > (print-local something) 42
> (define-syntax print-local-string (syntax-parser [(_ {~var id (local-value string?)}) (println (attribute id.local-value)) #'(void)])) > (print-local-string something) eval:6.0: print-local-string: bad syntax
in: (print-local-string something)
> (define-syntax print-local-string/message (syntax-parser [(_ {~var id (local-value string? #:failure-message "identifier was not bound to a string")}) (println (attribute id.local-value)) #'(void)])) > (print-local-string/message something) eval:8.0: print-local-string/message: identifier was not
bound to a string
at: something
in: (print-local-string/message something)
2 Lists and pairs with 'paren-shape
(require syntax/parse/class/paren-shape) | |
package: syntax-classes-lib |
syntax class
(paren-shape shape)
shape : any/c
Added in version 1.1 of package syntax-classes-lib.
syntax class
Added in version 1.1 of package syntax-classes-lib.
syntax class
Added in version 1.1 of package syntax-classes-lib.
syntax class
Added in version 1.1 of package syntax-classes-lib.
pattern expander
(~parens H-pattern . S-pattern)
> (syntax-parse #'(1 2 . "three") [(~parens a ... . rst) (cons #'(a ...) #'rst)]) '(#<syntax:eval:2:0 (1 2)> . #<syntax:eval:2:0 "three">)
> (syntax-parse #'{1 2 . "three"} [(~parens a ... . rst) (cons #'(a ...) #'rst)]) eval:3.0: ?: expected list or pair surrounded by parentheses
at: (1 2 . "three")
in: (1 2 . "three")
Added in version 1.1 of package syntax-classes-lib.
pattern expander
[~brackets H-pattern . S-pattern]
> (syntax-parse #'[1 2 . "three"] [[~brackets a ... . rst] (cons #'(a ...) #'rst)]) '(#<syntax:eval:2:0 (1 2)> . #<syntax:eval:2:0 "three">)
> (syntax-parse #'(1 2 . "three") [[~brackets a ... . rst] (cons #'(a ...) #'rst)]) eval:3.0: ?: expected list or pair surrounded by square
brackets
at: (1 2 . "three")
in: (1 2 . "three")
Added in version 1.1 of package syntax-classes-lib.
pattern expander
{~braces H-pattern . S-pattern}
> (syntax-parse #'{1 2 . "three"} [{~braces a ... . rst} (cons #'(a ...) #'rst)]) '(#<syntax:eval:2:0 (1 2)> . #<syntax:eval:2:0 "three">)
> (syntax-parse #'(1 2 . "three") [{~braces a ... . rst} (cons #'(a ...) #'rst)]) eval:3.0: ?: expected list or pair surrounded by curly
braces
at: (1 2 . "three")
in: (1 2 . "three")
Added in version 1.1 of package syntax-classes-lib.
3 Structure type transformer bindings
(require syntax/parse/class/struct-id) | |
package: syntax-classes-lib |
syntax class
The info attribute is bound to the list form of the struct-info? value (that is, the value produced by calling extract-struct-info on the transformer value).
The descriptor-id attribute is bound to an identifier that is bound to the structure type’s descriptor, or #f if none is known.
The constructor-id attribute is bound to an identifier that is bound to the structure type’s constructor, or #f if none is known.
The predicate-id attribute is bound to an identifier that is bound to the structure type’s predicate, or #f if none is known.
The all-fields-visible? attribute is bound to #t if all structure fields are visible to the macro, otherwise it is #f.
The num-fields attribute is bound to an exact, nonnegative integer that describes the number of visible fields the structure type has, including supertype fields.
The accessor-id attribute is an attribute of ellipsis depth 1 that is bound to identifiers bound to accessors for all visible structure fields, including supertype fields.
The mutator-id attribute is like accessor-id, except that it contains identifiers bound to mutators instead of accessors. It is guaranteed to have the same number of elements as accessor-id; however, the value will be #f for each non-mutable field.
The supertype-id attribute is bound to an identifier or a boolean. If it is an identifier, then the identifier is a structure type transformer binding for the structure’s supertype. If it is #t, then the structure has no supertype. If it is #f, then the structure’s supertype is unknown.
The num-supertype-fields attribute is like num-fields, except that it only counts supertype fields, not fields that belong to the structure type itself.
The num-own-fields attribute is like num-fields, except that it does not count supertype fields, only fields that belong to the structure type itself.
The own-accessor-id attribute is like accessor-id, except that it does not include supertype fields, only fields that belong to the structure type itself.
The own-mutator-id attribute is like mutator-id combined with the supertype-excluding behavior of own-accessor-id.
Due to the nature of the mutator-id attribute, it can be useful to use template from syntax/parse/experimental/template instead of syntax when using mutator ids.
> (define-syntax struct-accessors+mutators (syntax-parser [(_ id:struct-id) (template '((id.accessor-id (?? id.mutator-id #f)) ...))])) > (struct foo (bar [baz #:mutable] qux)) > (struct-accessors+mutators foo) '((foo-bar #f) (foo-baz set-foo-baz!) (foo-qux #f))