12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- {-# LANGUAGE OverloadedStrings #-}
- module Data.SCargot.Basic
- ( basicSpec
- , asRich
- , asWellFormed
- , addReader
- , setComment
- , withSemicolonComments
- , withQuote
- ) where
- import Data.Char (isAlphaNum)
- import Data.Attoparsec.Text (Parser, takeWhile1)
- import Data.Text (Text)
- import Data.SCargot.Repr.Basic
- import Data.SCargot.General hiding (withQuote)
- isAtomChar :: Char -> Bool
- isAtomChar c = isAlphaNum c
- || c == '-'
- || c == '*'
- || c == '/'
- || c == '+'
- || c == '<'
- || c == '>'
- || c == '='
- || c == '!'
- || c == '?'
- -- | A 'SExprSpec' that understands atoms to be sequences of
- -- alphanumeric characters as well as the punctuation
- -- characters @-*/+<>=!?@, and does no processing of them.
- -- This is not quite representative of actual lisps, which
- -- would (for example) accept various kinds of string
- -- literals. This should be sufficient for most ad-hoc
- -- storage or configuration formats.
- basicSpec :: SExprSpec Text (SExpr Text)
- basicSpec = mkSpec (takeWhile1 isAtomChar) id
- -- | Add the ability to understand a quoted S-Expression.
- -- This means that @'sexpr@ becomes sugar for
- -- @(quote sexpr)@. This is a variation on the identically-named
- -- function in Data.SCargot.General that has been specialized
- -- for the Basic atom type.
- withQuote :: SExprSpec Text a -> SExprSpec Text a
- withQuote = addReader '\'' (fmap go)
- where go s = SCons (SAtom "quote") (SCons s SNil)
|