[racket-dev] New error messages for *SL
I've clarified with Mike the problem, and that email. For reference,
that email had a macro that had some complication in that it
implemented a raw `include' with scribble syntax -- but putting the
code inside a scribble file makes that unnecessary.
So there are two problems: the first is that he wants to use
identifiers in the documentation-generating macro that depend on the
lexical context where the macro is used. In other words, he wants to
use a macro that breaks hygiene... which means that something like
this should work for that purpose:
(define-macro (foo x . body)
`@splice{
Blah blah blah, @racket[x], blah blah.
@, at body}) ; <-- "@" is for scribble, ",@" is as usual
Or even better, just avoid the `define-macro' guessing of context at
all:
(define-syntax (foo stx)
(syntax-case stx ()
[(_ x body ...)
(with-syntax ([x (syntax->datum #'x)]
[(body ...) (syntax->datum #'(body ...))])
#'@splice{
Blah blah blah, @racket[x], blah blah.
@|body ...|})])) ; <-- have `body' followed by `...'
(Funny that it's a similar kind of breakage that the literate
programming thing is doing.)
The other problem is that he wants the macro to generate a section
too, with references, which means that each use needs to generate
different tags. Instead of fighting with some gensym, what I
suggested earlier is to have some part of the tag be an input to the
macro, so it ends up like
(define-syntax (foo stx)
(syntax-case stx ()
[(_ tagpart x body ...)
(with-syntax ([x (syntax->datum #'x)]
[(body ...) (syntax->datum #'(body ...))]
[tag (format "foo-~a" (syntax->datum #'tagpart))])
#'@splice{
Blah blah blah, @racket[x], blah blah.
@subsection[#:tag tag]{Some Title}
More blah blah blah.
@|body ...|})]))
(Warning: I'm too tired to actually try the above... so it's
untested.)
--
((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
http://barzilay.org/ Maze is Life!