From 14ad0667bf25351e522faa7d9fbb3ff31619d92e Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 14 Oct 2020 19:35:12 +0530 Subject: add support for vectors a --- src/Evaluator.hs | 9 +++++---- src/Parser.hs | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/Evaluator.hs b/src/Evaluator.hs index b0171ba..8a5274f 100644 --- a/src/Evaluator.hs +++ b/src/Evaluator.hs @@ -16,10 +16,11 @@ apply fn args = maybe (lookup fn primitives) eval :: Expr -> LispResult Expr -eval v@(StringLiteral s) = return v -eval v@(IntLiteral i) = return v -eval v@(BoolLiteral b) = return v -eval v@(FloatLiteral f) = return v +eval v@(StringLiteral s) = return v +eval v@(IntLiteral i) = return v +eval v@(BoolLiteral b) = return v +eval v@(FloatLiteral f) = return v +eval v@(Vector xs) = liftM Vector $ mapM eval xs -- handle quotes as literals eval (List[Id "quote", val]) = return val eval (List[Id "quasiquote", val]) = undefined diff --git a/src/Parser.hs b/src/Parser.hs index dc754d3..69197b8 100644 --- a/src/Parser.hs +++ b/src/Parser.hs @@ -15,6 +15,7 @@ import Text.ParserCombinators.Parsec -- TODO: add character literals: \#a \#b \#c \#space \#newline -- TODO: add support for complex numbers, oct and hex numbers data Expr = List [Expr] + | Vector [Expr] | DottedList [Expr] Expr | StringLiteral String | IntLiteral Integer @@ -55,8 +56,15 @@ parseFloat = do let fval = characteristic ++ "." ++ mantissa return $ (FloatLiteral . read) $ maybe fval (:fval) sign +parseVector :: Parser Expr +parseVector = do + string "#(" >> optionalWhiteSpace + x <- sepEndBy parseLispValue whiteSpace + optionalWhiteSpace >> char ')' + return $ Vector x + symbol :: Parser Char -symbol = oneOf "!#$%&|*+:/-=@^_~" +symbol = oneOf "!$%&|*+:/-=@^_~" parseId :: Parser Expr parseId = do @@ -95,9 +103,10 @@ parseLispValue = <|> parseQuote <|> parseQuasiquote <|> parseUnquote + <|> parseVector -- handles lists and dotted lists <|> do - char '(' >> spaces + char '(' >> optionalWhiteSpace x <- sepEndBy parseLispValue whiteSpace spaces t <- optionMaybe $ char '.' >> space >> parseLispValue @@ -111,6 +120,7 @@ showLispList = unwords . map show instance Show Expr where show (DottedList xs x) = "(" ++ showLispList xs ++ " . " ++ show x ++ ")" show (List xs) = "(" ++ showLispList xs ++ ")" + show (Vector xs) = "#(" ++ showLispList xs ++ ")" show (StringLiteral s) = "\"" ++ s ++ "\"" show (IntLiteral n) = show n show (FloatLiteral n) = show n -- cgit v1.2.3