packages feed

nanopass-0.0.3.2: app/Lang.hs

{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE StandaloneDeriving #-}

module Lang where

import Data.Monoid (First)
import Language.Nanopass (deflang)

data Foo a b c = Foo [c]
  deriving (Show,Functor,Foldable,Traversable)

[deflang|
((L0 ann funny)
  (Expr
    (Var String)
    (Lam ann String (* Stmt))
    (App Expr Expr)
    (Nope String)
    (UhOh (&
      (* (First Expr))
      (* Expr)
      (Foo (Int) (Int) Expr)
    ))
  )
  (Stmt
    (Expr funny Expr)
    (Let String Expr)
  )
)
|]
deriving stock instance (Show ann, Show funny) => Show (Expr ann funny)
deriving stock instance (Show ann, Show funny) => Show (Stmt ann funny)