I'm twiddling with struct-plus-plus, adding declarative rules, and ~?
isn't doing what I expect. I expect that:
(~? rule) ...
is equivalent to (~? rule (~@)) and means "If `rule` matched
something, insert it here. Do this for each item that `rule` matched.
If `rule` did not match anything, put nothing here." That's not what
I'm seeing, though. The following is as stripped-down as I can get it
and still demonstrate the problem.
#lang racket
(require (for-syntax racket/syntax syntax/parse))
(define-syntax (struct++ stx)
(syntax-parse stx
[(_ name:id (field:id ...) (~optional (rule:expr ...)) opt ...)
#'(begin (struct name (field ...) opt ...)
(list (~? rule) ... ))]))
Given this declaration, it should be legal to omit the second set of
parentheses and their contents, but I'm getting compilation errors
when I do that.
; This works fine
(struct++ animal (species) ('testing 'testing) #:transparent)
(animal 'dog)
; As does this
(struct++ person (name age) () #:transparent)
(person 'bob 19)
; The lack of the second set of parens causes
; compilation to fail with the error:
; ?: attribute contains non-list value
; value: #f
(struct++ person (name age) #:transparent)
(person 'bob 19)
I can analyze it this far: I'm using the (~? head-template) form
here. `rule` is an identifier bound to a pattern variable, so `rule`
is a template. All templates are head-templates, therefore `rule` is
a head template. There were no rules for `rule` to match so `rule`
should be a missing pattern variable within the overall pattern, and
therefore the ~? form should emit nothing.
Clearly I'm not understanding something. Can someone point me in the
right direction?
--
You received this message because you are subscribed to the Google Groups
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.