diff options
| author | Arnaud Bailly <arnaud@pankzsoft.com> | 2026-03-22 13:16:21 +0100 |
|---|---|---|
| committer | Arnaud Bailly <arnaud@pankzsoft.com> | 2026-03-22 13:16:21 +0100 |
| commit | 4fed459d89b6b3abcce8028b19af806b48a38bd7 (patch) | |
| tree | e3bec85996ad03286b261d8f32eb456e35b164e0 /lambda-calcul/haskell/app/Main.hs | |
| parent | afb965ca75a106063c36195a1c180baebe610115 (diff) | |
| download | lambda-nantes-4fed459d89b6b3abcce8028b19af806b48a38bd7.tar.gz | |
Add builtin arithmetic operators
* also allow choosing evaluator
* ensures equivalence of evaluators up-to α-renaming
* checks server accepts answers from challenge
Diffstat (limited to 'lambda-calcul/haskell/app/Main.hs')
| -rw-r--r-- | lambda-calcul/haskell/app/Main.hs | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/lambda-calcul/haskell/app/Main.hs b/lambda-calcul/haskell/app/Main.hs index 6ba9321..8846c81 100644 --- a/lambda-calcul/haskell/app/Main.hs +++ b/lambda-calcul/haskell/app/Main.hs @@ -1,9 +1,11 @@ -import Minilang.REPL (withIO, withTerminal) +import Minilang.REPL (evaluatorFromEnv, withIO, withTerminal) +import Minilang.REPL.Types (Evaluator (..)) import Minilang.Server (startServer, waitServer) import Options.Applicative import System.IO (stdin, stdout) import System.Posix.IO (stdInput) import System.Posix.Terminal (queryTerminal) +import Text.Read (readMaybe) data RunMode = Local @@ -12,7 +14,9 @@ data RunMode data Options = Options { serverPort :: Int, - runMode :: RunMode + runMode :: RunMode, + -- | 'Nothing' means "read from MINILANG_EVAL env var". + evalOpt :: Maybe Evaluator } deriving (Eq, Show) @@ -26,7 +30,7 @@ optionsParser = minilangOptions :: Parser Options minilangOptions = - Options <$> portOption <*> runModeOption + Options <$> portOption <*> runModeOption <*> evalOption portOption :: Parser Int portOption = @@ -36,7 +40,7 @@ portOption = <> short 'p' <> value 7890 <> metavar "INT" - <> help "port to listent on (default: 7890)" + <> help "port to listen on (default: 7890)" ) runModeOption :: Parser RunMode @@ -49,13 +53,32 @@ runModeOption = <> help "run in server mode, listening for client REPLs over HTTP" ) +evalOption :: Parser (Maybe Evaluator) +evalOption = + optional $ + option + (eitherReader parseEvaluator) + ( long "eval" + <> short 'E' + <> metavar "EVALUATOR" + <> help "reduction strategy: DeBruijn (default) or NbE. \ + \Falls back to the MINILANG_EVAL environment variable." + ) + +parseEvaluator :: String -> Either String Evaluator +parseEvaluator s = case readMaybe s of + Just ev -> Right ev + Nothing -> Left $ "Unknown evaluator: " <> show s <> ". Valid values: DeBruijn, NbE" + main :: IO () main = do Options {..} <- execParser optionsParser + -- CLI flag takes precedence; fall back to env var. + ev <- maybe evaluatorFromEnv pure evalOpt case runMode of Local -> do hasTty <- queryTerminal stdInput if hasTty - then withTerminal - else withIO stdin stdout - Server -> startServer serverPort >>= waitServer + then withTerminal ev + else withIO ev stdin stdout + Server -> startServer serverPort ev >>= waitServer |
