eMacro :: (Get b, Eval b, Eval Expr) => [(Type, Key, Expr)] -> Expr -> Locus -> EvalM b
eMacro vals mac loc = do
  old <- getState
  ctx <- tryEvalM loc $ toStateT vals
  (defaultVals, e) <- evalWith mac (mergeStores [ctx, old]) >>= getVal :: EvalM (Store Expr, Expr)
  let newSt = mergeStores [ctx, defaultVals, old]
  evalWith e newSt >>= getVal >>= (`evalWith` newSt)



{--------------}
{- :Constants -}
{--------------}
eMacro :: (Get b, Eval b, Eval Expr) => [(Type, Key, Expr)] -> Expr -> Locus -> EvalM b
eMacro vals mac loc = do
  old <- getState
  ctx <- tryEvalM loc $ toStateT vals
  (defaultVals, e) <- evalWith mac (mergeStores [ctx, old]) >>= getVal :: EvalM (Store Expr, Expr)
  let newSt = mergeStores [ctx, defaultVals, old]
  evalWith e newSt >>= getVal >>= (`evalWith` newSt)



{--------------}
{- :Constants -}
{--------------}
eMacro vals mac loc = do
  old <- getState
  ctx <- tryEvalM loc $ toStateT vals
  (defaultVals, e) <- evalWith mac (mergeStores [ctx, old]) >>= getVal :: EvalM (Store Expr, Expr)
  let newSt = mergeStores [ctx, defaultVals, old]
  evalWith e newSt >>= getVal >>= (`evalWith` newSt)



{--------------}
{- :Constants -}
{--------------}