[plt-scheme] "define-values: cannot change identifier" when using "deserialize"
At Tue, 16 Oct 2007 05:15:36 -0700, Eric Hanchrow wrote:
> >>>>> "Matthew" == Matthew Flatt <mflatt at cs.utah.edu> writes:
>
> >> Thanks for doing the research, but I'm afraid I understand
> >> neither dynamic-require nor deserialize enough to guess the
> >> workaround. Could you spell it out?
>
> Matthew> One approach is to delay the `deserialize' call until the
> Matthew> "bot.ss" module body has been evaluated.
>
> As far as I can tell, it is already so delayed.
If I put
(fprintf (current-error-port) "bot.ss\n")
at the top of "bot.ss", and
(fprintf (current-error-port) "deserialize\n")
before the call to `deserialize' in "session.ss", then I see
"deserialize" printed before "bot".
> Matthew> Alternately, put the `define-serializable-struct' into a
> Matthew> module that can be `require'd by "session.ss", so that
> Matthew> the struct definition is definitely ready by the time
> Matthew> `deserialize' is called.
>
> I actually tried that originally; it led to a confusing error. To see
> it, apply the attached patch to r66, and run ./dry-test.sh again; I see
>
> sighting.ss:4:0: module: identifier already provided at: deserialize-
> info:sighting-v0 in: (provide (all-defined))
>
> I don't understand that error, either; nor can I find a way around it.
`deserialize-info:sighting-v0' is both defined and provided by
`define-serializable-struct'. At the moment, `(all-defined)' doesn't
play right with `define-serializable-struct'; this is one of several
problems with `(all-defined)'.
Using `(provide (struct sighting (who where when was-action? words)))'
works for me.
Matthew