SPECIALIZE
pragmas are syntactically restricted to type specializations of a name
(identifier) rather than a general expression. Is my understanding
correct here? If so, is there any reason for this restriction?
I ask because I’m reifying Core code (into code that constructs a
corresponding run-time representation for further processing), and I’m
looking for a clean way to integrate that process with GHC, to support
separate compilation and to avoid interfering with GHC’s regular flow.
It occurred to me that I could enable separate compilation via a pragma
of the form “{-# SPECIALIZE reify foo ∷ E t #-}
” for some t
, where E t
is a reified form of values of type t
. Type checking would infer the specialized type of foo
, and the usual specialization phase would do its usual thing on that specialization, leaving “reify foo = reify specialized_foo
”, and then the reification compiler plugin would transform the right-hand side, pushing the reify
inward. Some reify
calls may remain (e.g., due to polymorphism), triggering future rule
applications. As much as possible of the fully-reified version would be
factored out of the generated rule’s RHS for cheap reuse.
Thanks, - Conal