{-# LANGUAGE TemplateHaskell #-}

-- | Default implementations of some interpretation functions

module Language.Syntactic.Interpretation.Semantics where



import Language.Syntactic.Syntax


-- | A representation of a syntactic construct as a 'String' and an evaluation
-- function. It is not meant to be used as a syntactic symbol in an 'AST'. Its
-- only purpose is to provide the default implementations of functions like
-- `equal` via the `Semantic` class.
data Semantics a
  where
    Sem
        :: { semanticName :: String
           , semanticEval :: Denotation a
           }
        -> Semantics a


-- | The denotation of a symbol with the given signature
type family   Denotation sig
type instance Denotation (Full a)    = a
type instance Denotation (a :-> sig) = a -> Denotation sig


-- | Class of expressions that can be treated as constructs
class Semantic expr
  where
    semantics :: expr a -> Semantics a