More Syntax Classes
1 Locally bound transformer bindings
local-value
2 Lists and pairs with 'paren-shape
paren-shape
paren-shape/  parens
paren-shape/  brackets
paren-shape/  braces
~parens
~brackets
~braces
3 Structure type transformer bindings
struct-id
8.12

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    
  #:name name    
  #:failure-message failure-message])  syntax class
  predicate? : (any/c . -> . any/c) = (const #t)
  intdef-ctx : 
(or/c internal-definition-context?
      (listof internal-definition-context?)
      #f)
 = '()
  name : (or/c string? #f) = #f
  failure-message : (or/c string? #f) = #f
A syntax class for parsing identifiers bound to transformer bindings. It parses an identifier, then calls syntax-local-value on it and binds the result to an attribute named local-value.

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 name will be used when generating a parse error message, if it is not #f. If failure-message is not #f, it will be used instead of the generated message, though the value of name will still be used to show supplemental error information.

Examples:
> (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/name
    (syntax-parser
      [(_ {~var id (local-value string? #:name "string")})
       (println (attribute id.local-value))
       #'(void)]))
> (print-local-string/name something)

eval:8:0: print-local-string/name: expected string

  at: something

  in: (print-local-string/name something)

> (define-syntax print-local-string/message
    (syntax-parser
      [(_ {~var id (local-value
                    string?
                    #:name "string"
                    #:failure-message "identifier was not bound to a string")})
       (println (attribute id.local-value))
       #'(void)]))
> (print-local-string/message something)

eval:10:0: print-local-string/message: identifier was not

bound to a string

  at: something

  in: (print-local-string/message something)

  parsing context:

   while parsing string

    term: something

    location: eval:10:0

Changed in version 1.2 of package syntax-classes-lib: Added #:name argument.

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
Parses any syntax object that has a 'paren-shape syntax property with a value equal? to shape.

Added in version 1.1 of package syntax-classes-lib.

syntax class

paren-shape/parens

Parses any syntax object that either has #f for the 'paren-shape syntax property or does not have a 'paren-shape syntax property at all.

Added in version 1.1 of package syntax-classes-lib.

Parses any syntax object that has #\[ for the 'paren-shape syntax property.

Added in version 1.1 of package syntax-classes-lib.

syntax class

paren-shape/braces

Parses any syntax object that has #\{ for the 'paren-shape syntax property.

Added in version 1.1 of package syntax-classes-lib.

pattern expander

(~parens H-pattern . S-pattern)

A pattern expander that parses a list or pair that either has #f for the 'paren-shape syntax property or does not have a 'paren-shape syntax property at all.

Examples:
> (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]

A pattern expander that parses a list or pair that has #\[ for the 'paren-shape syntax property.

Examples:
> (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}

A pattern expander that parses a list or pair that has #\{ for the 'paren-shape syntax property.

Examples:
> (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

struct-id

A syntax class for parsing structure type transformer bindings. Like the local-value syntax class, it will parse an identifier, then call syntax-local-value on it to get a value. This syntax class will only match if the resulting value satisfies struct-info?, and it will then bind a set of attributes:

Examples:
> (define-syntax struct-accessors+mutators
    (syntax-parser
      [(_ id:struct-id)
       #'(list (cons id.accessor-id (?? id.mutator-id #f)) ...)]))
> (struct foo (bar [baz #:mutable] qux))
> (struct-accessors+mutators foo)

'((#<procedure:foo-bar> . #f)

  (#<procedure:foo-baz> . #<procedure:set-foo-baz!>)

  (#<procedure:foo-qux> . #f))

Note that while the field-sym and own-field-sym attributes have ellipsis depth 1, they are not syntax valued and therefore cannot be used directly as part of a syntax template. However, they may still be used with datum from syntax/datum as described in Attributes and datum.

Examples:
> (require (for-syntax syntax/datum))
> (define-syntax struct-field-names
    (syntax-parser
      [(_ id:struct-id)
       #`'#,(datum (id.field-sym ...))]))
> (struct foo (bar baz qux))
> (struct-field-names foo)

'(bar baz qux)

Changed in version 1.3 of package syntax-classes-lib: Added the field-sym and own-field-sym attributes.