The bug was in the way matching worked for lists. Specifically, if
you define a grammar like this one:
e ::= (- e)
(- e e)
integer
and you have a term like this:
(- (- (- (- (- (- (- 11)))))))
then at each step of matching against 'e', Redex would try both
alternatives, meaning it is attempting 2^n matches (where n is
the number of nested minus signs).
The fix eagerly checks the lengths of the lists and so brings this
back to a linear time matching problem.
(This came up in the delimited continuation model from the paper
_Constraining Delimited Control with Contracts_, ESOP 2013, altho
Redex's caching can mask the bad behavior, making this linear
again in normal uses of that model.)
We assume that any web browser where ".css" or ".js" useful
can also handle gzipped content. Compress files that are
at least 1k.
Also, use the new "shallow" mode of s3-sync to speed updates
to download.racket-lang.org.
Further reduce the "local-rediretc.js" file size by breaking out
the table of cross-reference keys --- which is only needed for indirect
links, and is therefore used infrequently. Furthermore, break the set of
keys into multiple pieces based on a hash of the key string, and each
piece is loaded independently on demand.
Keep track of the target document name (i.e., the name of the
directory that will contain the target document) for a cross
reference, when known. This identification enables a simpler dynamic
resolution of a hyperlink in almost all cases, istead of requiring
a search for an arbitrary corss-reference key.
Indirect links still need a mapping of cross-reference keys
to document locations, but the mapping can be pruned to just
section and module-name keys.
This change cuts a generated "local-redirect.js" for the main
distribution to 1/8 of its size.
When the compiler sees `(if #f A B)`, it compiles A in a throwaway
mode, but the throwaway mode need to produce a slightly more plausible
result than it was so that further throwaway transformation is not
confused.
This information is about internal implementation details, more or
less. Some details can leak out, such as when files get mangled or
browser cookies get stuck. Mostly, though, the intent is to document
how various of pieces fit together to make builds and distributions
work.