[plt-scheme] rules on syntax-rule literals?
YC wrote:
> However, if I put the above into a module and run within REPL, then I
> ran into bad-syntax error.
>
> (module foo mzscheme
> (define-syntax m
> (syntax-rules (> <)
> ((_ (> exp exp2))
> '(> exp exp2))
> ((_ (< exp exp2))
> '(< exp exp2))
> ))
> (provide (all-defined)))
> (require foo)
> (m (< 5 10)) ; => m: bad syntax in: (m (< 5 10))
> (m (> 5 10)) ; => m: bad syntax in: (m (> 5 10))
The reason is subtle.
The < exported from mzscheme and the top-level <
isn't the same. Intuitively the reason is that
the mzscheme < is constant (and is always inlined),
whereas the top-level < can be assigned to.
You have two options. Either import the mzscheme
to the top-level before using m:
(require foo)
(require mzscheme)
(m (< 5 10))
Or use syntax-case* with module-or-top-identifier=?
(module foo mzscheme
(require-for-syntax (lib "stx.ss" "syntax"))
(define-syntax (m stx)
(syntax-case* stx (> <) module-or-top-identifier=?
((_ (> exp exp2))
#''(> exp exp2))
((_ (< exp exp2))
#''(< exp exp2))
))
(provide (all-defined)))
(require foo)
(m (< 5 10))
--
Jens Axel Søgaard