Mirror of http://offog.org/git/tock.git . Tock (translator from occam to C from Kent) is a Haskell-based compiler for occam and related languages.
![]() This provides gmapMFor and gmapMFor2, which are like gmapM, but know what they're looking for, and can therefore avoid going down branches of the tree that won't contain any interesting types. The basic approach is quite similar to Uniplate's PlateData: there's a function (containsType) that'll tell you whether one type is contained somewhere within another. However, unlike Uniplate, we build a static IntMap IntSet of the types we need to know about, which allows rather quicker lookups. (I did try using PlateData first.) The result is that applyDepthM is now much quicker than it was before. applyDepthM2 is a bit less impressive, which I assume is because it can't really prune the tree much if it's looking for two types. Future enhancements: - convert more passes to use applyDepthM*; - make gmapMFor* aware of constructors rather than just types, which should allow a bit more pruning. |
||
---|---|---|
backends | ||
checks | ||
common | ||
data | ||
docextra | ||
flow | ||
frontends | ||
pass | ||
support | ||
testcases | ||
transformations | ||
AUTHORS | ||
cgtests.mk | ||
ChangeLog | ||
compile-cgtests | ||
configure.ac | ||
COPYING | ||
COPYING.LIB | ||
GenOrdAST.hs | ||
GenTagAST.hs | ||
LANGUAGE | ||
Main.hs | ||
Makefile.am | ||
NEWS | ||
README | ||
SYNTAX | ||
TestMain.hs | ||
TODO |