12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- -- | 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
|