packages feed

formura-1.0: exe-src/formura-eval.hs

{-# LANGUAGE DataKinds #-}
module Main where

import           Control.Lens
import           Data.Monoid
import           System.Environment
import           System.IO
import qualified Text.PrettyPrint.ANSI.Leijen as Ppr
import qualified Text.Trifecta as P

import           Formura.Interpreter.Eval
import qualified Formura.Parser as P
import           Formura.Syntax

main :: IO ()
main = do
  argv <- getArgs
  mapM_ process argv

process :: FilePath -> IO ()
process fn = do
  mprog <- P.parseFromFileEx (P.runP $ P.program <* P.eof) fn
  case mprog of
      P.Failure doc -> Ppr.displayIO stdout $ Ppr.renderPretty 0.8 80 $ doc <> Ppr.linebreak
      P.Success prog -> do
        let BindingF stmts = prog ^. programBinding
        mapM_ evalStmt stmts

evalStmt :: StatementF RExpr -> IO ()
evalStmt (TypeDecl _ _) = return ()
evalStmt (Subst l r) = do
  putStrLn $ show l ++ " = " ++ show r
  rv <- runIM $ eval r
  case rv of
    Left doc -> Ppr.displayIO stdout $ Ppr.renderPretty 0.8 80 $ doc <> Ppr.linebreak
    Right vt -> print vt
  putStrLn ""