The general reason is that the compile-time environment is ephemeral
--- but, yes, the reason that matters mostly has to do with module
bindings.
Suppose you have a module
#lang racket/base
(provide m)
(define-syntax-rule (m) (lambda () #t))
The implementation of `m` includes a syntax object #'lambda, and that
syntax object needs to carry the information that it references
`lambda` from `racket/base`.
By the time the module is expanded or compiled, there is no
compile-time environment, anymore. So, the information that `lambda`
refers to the export of `racket/base` can't be in the compile-time
environment. The information needs to be in the binding store.
The same thing happens with references to top-level bindings, since
references to those can also appear in an expanded term that doesn't
itself include the binding. For references to local bindings (that
haven't disappeared), the connection between the reference and a
specific binding can be rediscovered in a given term; I guess the
symbol plus scope set would work for the binding's representation in
that case, instead of an arbitrary opaque value.
> --
> 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
racket-dev+...@googlegroups.com.
> To post to this group, send email to
racke...@googlegroups.com.
> To view this discussion on the web visit
>
https://groups.google.com/d/msgid/racket-dev/55E139AB.3010009%40memebeam.org.
> For more options, visit
https://groups.google.com/d/optout.