summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/app/Main.hs
diff options
context:
space:
mode:
authorArnaud Bailly <arnaud@pankzsoft.com>2026-03-22 13:16:21 +0100
committerArnaud Bailly <arnaud@pankzsoft.com>2026-03-22 13:16:21 +0100
commit4fed459d89b6b3abcce8028b19af806b48a38bd7 (patch)
treee3bec85996ad03286b261d8f32eb456e35b164e0 /lambda-calcul/haskell/app/Main.hs
parentafb965ca75a106063c36195a1c180baebe610115 (diff)
downloadlambda-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.hs37
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