-- | Contains the type of atoms that Common Lisp understands, as -- well as the built-in reader macros that Common Lisp provides. -- Given a Common Lisp source file that contains no extra reader -- macro definitions, this module should successfully parse and -- desugar even quoted lists and vector literals. module Data.SCargot.CommonLisp ( CLAtom(..) , CommonLispSpec , withComments , withQuote , withVectors , decode , encode ) where data CLAtom = CLSymbol Text | CLString Text | CLInteger Integer | CLRatio Integer Integer | CLFloat Double deriving (Eq, Show, Read) data CommonLispSpec carrier = CommonLispSpec { sexprSpec :: SExprSpec CLAtom carrier , octoReaders :: ReaderMacroMap CLAtom } withComments :: CommonLispSpec c -> CommonLispSpec c withComments = addCommentType (const () <$> (char ';' *> restOfLine)) withQuote :: CommonLispSpec (SCons CLAtom) -> CommonLispSpec (SCons CLAtom) withQuote = addReader '\'' (go <$> parse) where go v = SCons q (SCons v SNil) -- | Adds support for the '#(...)' sugar for vectors. (This will be -- parsed as '(vector ...)', and withVectors :: CommonLispSpec c -> CommonLispSpec c withVectors = addReader '#' (go <$> parse) decode :: CommonLispSpec c -> Text -> Either String c encode :: CommonLispSpec c -> c -> Text