As an experiment, I've changed the ".zo" writer and reader to preserve
source locations and 'paren-shape properties for syntax objects.
Saving source locations can be helpful in a couple of situations:
* For a macro implementor, when a macro is implemented by a module
that is compiled to ".zo" form and something goes wrong with a use
of the macro in another module, the expansion error can more likely
point to parts of the macro implementation.
* Unusual macros that depend on source-location information, such as
Scribble's `racketblock`, tend not to compose with other macros.
While a macro like `racketblock` can expand in a way that preserves
needed source locations, macros that expand to `racketblock` tend to
go wrong when compiled to ".zo" form. Similarly, a macro might treat
`[...]` or `{...}` specially, based on the 'paren-shape property,
and then other macros that expand to that one don't work right
unless the property is preserved.
There are also some drawbacks to keeping source locations:
* It costs space. Happily, this cost is lower than I thought it would
be: ".zo" files are only about 10% bigger on average (thanks to a
big pile of marshaling tricks that we've built up over the years).
The effect on run-time memory seems to be even smaller (thanks to a
big pile of on-demand-loading machinery).
* Source locations associated with a macro's implementation can be a
distraction for users other than the macro's implementor.
Furthermore, source locations can bleed through in cases other than
syntax errors.
For example, the change makes the `racket` REPL behave like this:
> (lambda (x) x)
#<procedure>
> (eval '(lambda (x) x))
#<procedure:...t/private/kw.rkt:394:14>
In the first case, the source location for the `lambda` expression
doesn't refer to a file, so it isn't included in the output. In the
second case, the S-expression for the `lambda` expression is
converted to a syntax object that has *no* source location, and so a
source location is eventualy inherited from the implementation of
the `lambda` macro.
On the whole, I think saving source locations is going to be better
than not, but we'll have to try it out.
I didn't yet attempt to change `quote-syntax/keep-srcloc` or other
things that expand in special ways to preserve source locations. If the
experiment works out, that's a next step.
--
You received this message because you are subscribed to the Google Groups
"Racket Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/racket-dev/20150903003024.514F86501CE%40mail-svr1.cs.utah.edu.
For more options, visit https://groups.google.com/d/optout.