Skip to content

Commit

Permalink
Separate option-related definition into a new file CmdOptions.hs
Browse files Browse the repository at this point in the history
  • Loading branch information
momohatt committed Nov 21, 2019
1 parent 480bd68 commit 304dfe8
Show file tree
Hide file tree
Showing 9 changed files with 151 additions and 128 deletions.
2 changes: 2 additions & 0 deletions egison.cabal
Expand Up @@ -93,6 +93,7 @@ Library
, vector
, split
, hashable
, optparse-applicative
, prettyprinter
if !impl(ghc > 8.0)
Build-Depends: fail
Expand All @@ -101,6 +102,7 @@ Library
Language.Egison
Language.Egison.AST
Language.Egison.Core
Language.Egison.CmdOptions
Language.Egison.Desugar
Language.Egison.Types
Language.Egison.Parser
Expand Down
104 changes: 6 additions & 98 deletions hs-src/Interpreter/egison.hs
Expand Up @@ -9,7 +9,6 @@ import Control.Monad.Except
import Control.Monad.Trans.State
import Prelude hiding (catch)

import Data.Char
import Data.Semigroup ((<>))
import qualified Data.Text as T

Expand All @@ -22,111 +21,20 @@ import System.FilePath ((</>))
import System.IO

import Language.Egison
import Language.Egison.CmdOptions
import Language.Egison.Core (recursiveBind)
import Language.Egison.MathOutput
import Language.Egison.Util

import Options.Applicative


main :: IO ()
main = execParser parserInfo >>= runWithOptions

parserInfo :: ParserInfo EgisonOpts
parserInfo = info (helper <*> parser)
$ fullDesc
<> header "The Egison Programming Language"
where
parser = EgisonOpts
<$> optional ((,) <$> strArgument (metavar "FILE") <*> many (strArgument (metavar "ARGS")))
<*> switch
(short 'v'
<> long "version"
<> help "Show version number")
<*> optional (strOption
(short 'e'
<> long "eval"
<> metavar "EXPR"
<> help "Evaluate the argument string"))
<*> optional (strOption
(short 'c'
<> long "command"
<> metavar "EXPR"
<> help "Execute the argument string"))
<*> many (readFieldOption <$> strOption
(short 'F'
<> long "field"
<> metavar "FIELD"
<> help "Field information"))
<*> many (strOption
(short 'L'
<> long "load-library"
<> metavar "FILE"
<> help "Load library"))
<*> many (strOption
(short 'l'
<> long "load-file"
<> metavar "FILE"
<> help "Load file"))
<*> optional (strOption
(short 's'
<> long "substitute"
<> metavar "EXPR"
<> help "Operate input in tsv format as infinite stream"))
<*> optional ((\s -> "(map " ++ s ++ " $)") <$> strOption
(short 'm'
<> long "map"
<> metavar "EXPR"
<> help "Operate input in tsv format line by line"))
<*> optional ((\s -> "(filter " ++ s ++ " $)") <$> strOption
(short 'f'
<> long "filter"
<> metavar "EXPR"
<> help "Filter input in tsv format line by line"))
<*> switch
(short 'T'
<> long "tsv"
<> help "Output in tsv format")
<*> switch
(long "no-io"
<> help "Prohibit all io primitives")
<*> flag True False
(long "no-banner"
<> help "Do not display banner")
<*> switch
(short 't'
<> long "test"
<> help "Execute only test expressions")
<*> strOption
(short 'p'
<> long "prompt"
<> metavar "STRING"
<> value "> "
<> help "Set prompt string")
<*> optional (strOption
(short 'M'
<> long "math"
<> metavar "(asciimath|latex|mathematica|maxima)"
<> help "Output in AsciiMath, Latex, Mathematica, or Maxima format"))
<*> flag True False
(short 'N'
<> long "new-syntax"
<> help "[experimental] Use non-S expression syntax")
main = execParser cmdParser >>= runWithOptions

readFieldOption :: String -> (String, String)
readFieldOption str =
let (s, rs) = span isDigit str in
case rs of
',':rs' -> let (e, opts) = span isDigit rs' in
case opts of
['s'] -> ("{" ++ s ++ " " ++ e ++ "}", "")
['c'] -> ("{}", "{" ++ s ++ " " ++ e ++ "}")
['s', 'c'] -> ("{" ++ s ++ " " ++ e ++ "}", "{" ++ s ++ " " ++ e ++ "}")
['c', 's'] -> ("{" ++ s ++ " " ++ e ++ "}", "{" ++ s ++ " " ++ e ++ "}")
['s'] -> ("{" ++ s ++ "}", "")
['c'] -> ("", "{" ++ s ++ "}")
['s', 'c'] -> ("{" ++ s ++ "}", "{" ++ s ++ "}")
['c', 's'] -> ("{" ++ s ++ "}", "{" ++ s ++ "}")
cmdParser :: ParserInfo EgisonOpts
cmdParser = info (helper <*> cmdArgParser)
$ fullDesc
<> header "The Egison Programming Language"

runWithOptions :: EgisonOpts -> IO ()
runWithOptions opts
Expand Down
1 change: 1 addition & 0 deletions hs-src/Language/Egison.hs
Expand Up @@ -35,6 +35,7 @@ import Data.Version
import qualified Paths_egison as P

import Language.Egison.AST
import Language.Egison.CmdOptions
import Language.Egison.Core
import Language.Egison.MathOutput (changeOutputInLang)
import Language.Egison.Parser as Parser
Expand Down
8 changes: 8 additions & 0 deletions hs-src/Language/Egison/AST.hs
@@ -1,6 +1,14 @@
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}

{- |
Module : Language.Egison.AST
Copyright : Satoshi Egi
Licence : MIT
This module defines the syntax of Egison.
-}

module Language.Egison.AST
( EgisonTopExpr (..)
, EgisonExpr (..)
Expand Down
131 changes: 131 additions & 0 deletions hs-src/Language/Egison/CmdOptions.hs
@@ -0,0 +1,131 @@
{- |
Module : Language.Egison.CmdOptions
Copyright : Satoshi Egi
Licence : MIT
This module provides command line options of Egison interpreter.
-}

module Language.Egison.CmdOptions
( EgisonOpts (..)
, defaultOption
, cmdArgParser
) where

import Data.Char (isDigit)
import Options.Applicative

data EgisonOpts = EgisonOpts {
optExecFile :: Maybe (String, [String]),
optShowVersion :: Bool,
optEvalString :: Maybe String,
optExecuteString :: Maybe String,
optFieldInfo :: [(String, String)],
optLoadLibs :: [String],
optLoadFiles :: [String],
optSubstituteString :: Maybe String,
optMapTsvInput :: Maybe String,
optFilterTsvInput :: Maybe String,
optTsvOutput :: Bool,
optNoIO :: Bool,
optShowBanner :: Bool,
optTestOnly :: Bool,
optPrompt :: String,
optMathExpr :: Maybe String,
optSExpr :: Bool
}

defaultOption :: EgisonOpts
defaultOption = EgisonOpts Nothing False Nothing Nothing [] [] [] Nothing Nothing Nothing False False True False "> " Nothing True

cmdArgParser :: Parser EgisonOpts
cmdArgParser = EgisonOpts
<$> optional ((,) <$> strArgument (metavar "FILE") <*> many (strArgument (metavar "ARGS")))
<*> switch
(short 'v'
<> long "version"
<> help "Show version number")
<*> optional (strOption
(short 'e'
<> long "eval"
<> metavar "EXPR"
<> help "Evaluate the argument string"))
<*> optional (strOption
(short 'c'
<> long "command"
<> metavar "EXPR"
<> help "Execute the argument string"))
<*> many (readFieldOption <$> strOption
(short 'F'
<> long "field"
<> metavar "FIELD"
<> help "Field information"))
<*> many (strOption
(short 'L'
<> long "load-library"
<> metavar "FILE"
<> help "Load library"))
<*> many (strOption
(short 'l'
<> long "load-file"
<> metavar "FILE"
<> help "Load file"))
<*> optional (strOption
(short 's'
<> long "substitute"
<> metavar "EXPR"
<> help "Operate input in tsv format as infinite stream"))
<*> optional ((\s -> "(map " ++ s ++ " $)") <$> strOption
(short 'm'
<> long "map"
<> metavar "EXPR"
<> help "Operate input in tsv format line by line"))
<*> optional ((\s -> "(filter " ++ s ++ " $)") <$> strOption
(short 'f'
<> long "filter"
<> metavar "EXPR"
<> help "Filter input in tsv format line by line"))
<*> switch
(short 'T'
<> long "tsv"
<> help "Output in tsv format")
<*> switch
(long "no-io"
<> help "Prohibit all io primitives")
<*> flag True False
(long "no-banner"
<> help "Do not display banner")
<*> switch
(short 't'
<> long "test"
<> help "Execute only test expressions")
<*> strOption
(short 'p'
<> long "prompt"
<> metavar "STRING"
<> value "> "
<> help "Set prompt string")
<*> optional (strOption
(short 'M'
<> long "math"
<> metavar "(asciimath|latex|mathematica|maxima)"
<> help "Output in AsciiMath, Latex, Mathematica, or Maxima format"))
<*> flag True False
(short 'N'
<> long "new-syntax"
<> help "[experimental] Use non-S expression syntax")

readFieldOption :: String -> (String, String)
readFieldOption str =
let (s, rs) = span isDigit str in
case rs of
',':rs' -> let (e, opts) = span isDigit rs' in
case opts of
['s'] -> ("{" ++ s ++ " " ++ e ++ "}", "")
['c'] -> ("{}", "{" ++ s ++ " " ++ e ++ "}")
['s', 'c'] -> ("{" ++ s ++ " " ++ e ++ "}", "{" ++ s ++ " " ++ e ++ "}")
['c', 's'] -> ("{" ++ s ++ " " ++ e ++ "}", "{" ++ s ++ " " ++ e ++ "}")
['s'] -> ("{" ++ s ++ "}", "")
['c'] -> ("", "{" ++ s ++ "}")
['s', 'c'] -> ("{" ++ s ++ "}", "{" ++ s ++ "}")
['c', 's'] -> ("{" ++ s ++ "}", "{" ++ s ++ "}")
1 change: 1 addition & 0 deletions hs-src/Language/Egison/Core.hs
Expand Up @@ -65,6 +65,7 @@ import Data.Text (Text)
import qualified Data.Text as T

import Language.Egison.AST
import Language.Egison.CmdOptions
import Language.Egison.Parser as Parser
import Language.Egison.ParserNonS as ParserNonS
import Language.Egison.Types
Expand Down
29 changes: 0 additions & 29 deletions hs-src/Language/Egison/Types.hs
Expand Up @@ -135,8 +135,6 @@ module Language.Egison.Types
, isCollection'
, isArray'
, isHash'
, EgisonOpts (..)
, defaultOption
) where

import Prelude hiding (foldr, mappend, mconcat)
Expand Down Expand Up @@ -1646,30 +1644,3 @@ isHash' (Value (StrHash _)) = return $ Value $ Bool True
isHash' (Intermediate (IIntHash _)) = return $ Value $ Bool True
isHash' (Intermediate (IStrHash _)) = return $ Value $ Bool True
isHash' _ = return $ Value $ Bool False

--
-- options
--

data EgisonOpts = EgisonOpts {
optExecFile :: Maybe (String, [String]),
optShowVersion :: Bool,
optEvalString :: Maybe String,
optExecuteString :: Maybe String,
optFieldInfo :: [(String, String)],
optLoadLibs :: [String],
optLoadFiles :: [String],
optSubstituteString :: Maybe String,
optMapTsvInput :: Maybe String,
optFilterTsvInput :: Maybe String,
optTsvOutput :: Bool,
optNoIO :: Bool,
optShowBanner :: Bool,
optTestOnly :: Bool,
optPrompt :: String,
optMathExpr :: Maybe String,
optSExpr :: Bool
}

defaultOption :: EgisonOpts
defaultOption = EgisonOpts Nothing False Nothing Nothing [] [] [] Nothing Nothing Nothing False False True False "> " Nothing True
2 changes: 1 addition & 1 deletion hs-src/Language/Egison/Util.hs
Expand Up @@ -18,9 +18,9 @@ import System.Console.Haskeline.History (addHistoryUnlessConsecutiveDu
import Text.Regex.TDFA ((=~))

import Language.Egison.AST
import Language.Egison.CmdOptions
import Language.Egison.Parser as Parser
import Language.Egison.ParserNonS as ParserNonS
import Language.Egison.Types

-- |Get Egison expression from the prompt. We can handle multiline input.
getEgisonExpr :: EgisonOpts -> InputT IO (Maybe (String, EgisonTopExpr))
Expand Down
1 change: 1 addition & 0 deletions test/Test.hs
Expand Up @@ -15,6 +15,7 @@ import Test.HUnit

import Language.Egison
import Language.Egison.Core
import Language.Egison.CmdOptions
import qualified Language.Egison.Parser as Parser
import qualified Language.Egison.ParserNonS as ParserNonS
import Language.Egison.Primitives
Expand Down

0 comments on commit 304dfe8

Please sign in to comment.