syntactic-0.9: Generic abstract syntax, and utilities for embedded languages

Safe HaskellNone



This module is similar to Language.Syntactic.Sharing.Reify, but operates on AST (HODomain ctx dom) rather than a general AST. The reason for having this module is that when using HODomain, it is important to do simultaneous sharing analysis and HOLambda reification. Obviously we cannot do sharing analysis first (using reifyGraph from Language.Syntactic.Sharing.Reify), since it needs to be able to look inside HOLambda. On the other hand, if we did HOLambda reification first (using reify), we would destroy the sharing.

This module is based on Type-Safe Observable Sharing in Haskell (Andy Gill, Haskell Symposium, 2009).



reifyGraphTop :: Typeable a => (forall a. ASTF (HODomain ctx dom) a -> Maybe (SatWit ctx a)) -> ASTF (HODomain ctx dom) a -> IO (ASG ctx (Lambda ctx :+: (Variable ctx :+: dom)) a, VarId)Source

Convert a syntax tree to a sharing-preserving graph



:: Syntactic a (HODomain ctx dom) 
=> (forall a. ASTF (HODomain ctx dom) a -> Maybe (SatWit ctx a))

A function that decides whether a given node can be shared. Nothing means "don't share"; Just means "share". Nodes whose result type fulfills (Sat ctx a) can be shared, which is why the function returns a SatWit.

-> a 
-> IO (ASG ctx (Lambda ctx :+: (Variable ctx :+: dom)) (Internal a), VarId) 

Reifying an n-ary syntactic function to a sharing-preserving graph

This function is not referentially transparent (hence the IO). However, it is well-behaved in the sense that the worst thing that could happen is that sharing is lost. It is not possible to get false sharing.