diff options
Diffstat (limited to 'lambda-calcul/haskell/src/Minilang/IO.hs')
| -rw-r--r-- | lambda-calcul/haskell/src/Minilang/IO.hs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lambda-calcul/haskell/src/Minilang/IO.hs b/lambda-calcul/haskell/src/Minilang/IO.hs new file mode 100644 index 0000000..bfcb125 --- /dev/null +++ b/lambda-calcul/haskell/src/Minilang/IO.hs @@ -0,0 +1,40 @@ +{-# LANGUAGE DuplicateRecordFields #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE TypeSynonymInstances #-} +{-# OPTIONS_GHC "-fno-warn-orphans" #-} + +module Minilang.IO where + +import qualified Data.ByteString as BS +import Data.Text.Encoding + ( decodeUtf8With, + encodeUtf8, + ) +import Data.Text.Encoding.Error (lenientDecode) +import Minilang.Lambda.Eval hiding (rho) +import Minilang.Parser +import Minilang.Type +import Prettyprinter +import Prettyprinter.Render.Text +import System.IO (Handle) + +-- | Read an `AST` from @hin@ handle, evaluate it and dump the result +-- on @hout@. +runEval :: Handle -> Handle -> IO () +runEval hin hout = do + programText <- decodeUtf8With lenientDecode <$> BS.hGetContents hin + let ast = parseProgram False programText + ρ = EmptyEnv + γ = EmptyContext + (ρ', _) <- loadProgram ast ρ γ + let val = eval ast ρ' + + BS.hPut + hout + ( encodeUtf8 + ( renderStrict $ layoutPretty defaultLayoutOptions $ pretty val + ) + <> "\n" + ) |
