It seems to be the case thatSPECIALIZE
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 somet
, whereE t
is a reified form of values of typet
. Type checking would infer the specialized type offoo
, 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 thereify
inward. Somereify
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