partial exo 6 (Float)
This commit is contained in:
parent
a5285e5ddb
commit
9e59d4fc53
3 changed files with 33 additions and 16 deletions
1
tests/float.in
Normal file
1
tests/float.in
Normal file
|
@ -0,0 +1 @@
|
||||||
|
3.14
|
1
tests/float.out
Normal file
1
tests/float.out
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Float 3.14
|
47
y.hs
47
y.hs
|
@ -4,15 +4,39 @@ import Data.List (foldl')
|
||||||
import Text.ParserCombinators.Parsec hiding (spaces)
|
import Text.ParserCombinators.Parsec hiding (spaces)
|
||||||
import System.Environment (getArgs)
|
import System.Environment (getArgs)
|
||||||
|
|
||||||
|
-- The possible LISP values
|
||||||
data LispVal = Atom String
|
data LispVal = Atom String
|
||||||
| List [LispVal]
|
| List [LispVal]
|
||||||
| DottedList [LispVal] LispVal
|
| DottedList [LispVal] LispVal
|
||||||
|
| Float Float
|
||||||
| Number Integer
|
| Number Integer
|
||||||
| Character Char
|
| Character Char
|
||||||
| String String
|
| String String
|
||||||
| Bool Bool
|
| Bool Bool
|
||||||
deriving (Show)
|
deriving (Show)
|
||||||
|
|
||||||
|
-- The program (in IO)
|
||||||
|
-- execute the arguments given in parameters
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
args <- getArgs
|
||||||
|
putStrLn (readExpr (args !!0))
|
||||||
|
|
||||||
|
-- ReadExpr will take a program as input
|
||||||
|
-- and will return the result of a parseExpr
|
||||||
|
readExpr :: String -> String
|
||||||
|
readExpr input = case parse parseExpr "lisp" input of
|
||||||
|
Left err -> "No match: " ++ show err
|
||||||
|
Right val -> show val
|
||||||
|
|
||||||
|
-- parseExpr will parse the Expression
|
||||||
|
parseExpr :: Parser LispVal
|
||||||
|
parseExpr = parseString
|
||||||
|
<|> try parseChar -- #\a #\b etc...
|
||||||
|
<|> try parseFloat -- 3.1415
|
||||||
|
<|> parseNumber -- 3, #b011001, #o070, #d930, #xFF3
|
||||||
|
<|> parseAtom -- symbol-323
|
||||||
|
|
||||||
symbol :: Parser Char
|
symbol :: Parser Char
|
||||||
symbol = oneOf "!#$%&|*+-/:<=>?@^_~"
|
symbol = oneOf "!#$%&|*+-/:<=>?@^_~"
|
||||||
|
|
||||||
|
@ -101,25 +125,16 @@ parseSimpleNumber = do
|
||||||
numStr <- many1 digit
|
numStr <- many1 digit
|
||||||
return (read numStr)
|
return (read numStr)
|
||||||
|
|
||||||
|
parseFloat :: Parser LispVal
|
||||||
|
parseFloat = do
|
||||||
|
numBeforeDot <- many1 digit
|
||||||
|
char '.'
|
||||||
|
numAfterDot <- many1 digit
|
||||||
|
return $ Float (read (numBeforeDot ++ "." ++ numAfterDot))
|
||||||
|
|
||||||
parseNumber :: Parser LispVal
|
parseNumber :: Parser LispVal
|
||||||
parseNumber = do
|
parseNumber = do
|
||||||
number <- parseSimpleNumber
|
number <- parseSimpleNumber
|
||||||
<|> parseBaseSpecifiedNumber
|
<|> parseBaseSpecifiedNumber
|
||||||
return (Number number)
|
return (Number number)
|
||||||
|
|
||||||
parseExpr :: Parser LispVal
|
|
||||||
parseExpr = parseString
|
|
||||||
<|> try parseChar
|
|
||||||
<|> parseNumber
|
|
||||||
<|> parseAtom
|
|
||||||
|
|
||||||
|
|
||||||
readExpr :: String -> String
|
|
||||||
readExpr input = case parse parseExpr "lisp" input of
|
|
||||||
Left err -> "No match: " ++ show err
|
|
||||||
Right val -> show val
|
|
||||||
|
|
||||||
main :: IO ()
|
|
||||||
main = do
|
|
||||||
args <- getArgs
|
|
||||||
putStrLn (readExpr (args !!0))
|
|
||||||
|
|
Loading…
Reference in a new issue