atto-lisp-0.2.2.3: Efficient parsing and serialisation of S-Expressions.

Safe HaskellNone
LanguageHaskell2010

Data.AttoLisp

Contents

Description

Efficient parsing and serialisation of S-Expressions (as used by Lisp).

This module is intended to be imported qualified, e.g.:

import qualified Data.AttoLisp as L
Synopsis

Core Lisp Types

data Lisp Source #

A Lisp expression (S-expression).

Symbols are case-sensitive.

NOTE: The Number type is deprecated in "attoparsec", so a future version of "atto-lisp" will switch to the Scientific type from the "scientific" package.

Constructors

Symbol Text

A symbol (including keyword)

String Text

A string.

Number Number

A number

List [Lisp]

A proper list: (foo x 42)

DotList [Lisp] Lisp

A list with a non-nil tail: (foo x . 42). The list argument must be non-empty and the tail must be non-nil.

Instances
Eq Lisp Source # 
Instance details

Defined in Data.AttoLisp

Methods

(==) :: Lisp -> Lisp -> Bool #

(/=) :: Lisp -> Lisp -> Bool #

Data Lisp Source # 
Instance details

Defined in Data.AttoLisp

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Lisp -> c Lisp #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Lisp #

toConstr :: Lisp -> Constr #

dataTypeOf :: Lisp -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c Lisp) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Lisp) #

gmapT :: (forall b. Data b => b -> b) -> Lisp -> Lisp #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Lisp -> r #

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Lisp -> r #

gmapQ :: (forall d. Data d => d -> u) -> Lisp -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Lisp -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Lisp -> m Lisp #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Lisp -> m Lisp #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Lisp -> m Lisp #

Ord Lisp Source # 
Instance details

Defined in Data.AttoLisp

Methods

compare :: Lisp -> Lisp -> Ordering #

(<) :: Lisp -> Lisp -> Bool #

(<=) :: Lisp -> Lisp -> Bool #

(>) :: Lisp -> Lisp -> Bool #

(>=) :: Lisp -> Lisp -> Bool #

max :: Lisp -> Lisp -> Lisp #

min :: Lisp -> Lisp -> Lisp #

Show Lisp Source # 
Instance details

Defined in Data.AttoLisp

Methods

showsPrec :: Int -> Lisp -> ShowS #

show :: Lisp -> String #

showList :: [Lisp] -> ShowS #

IsString Lisp Source # 
Instance details

Defined in Data.AttoLisp

Methods

fromString :: String -> Lisp #

NFData Lisp Source # 
Instance details

Defined in Data.AttoLisp

Methods

rnf :: Lisp -> () #

FromLisp Lisp Source # 
Instance details

Defined in Data.AttoLisp

ToLisp Lisp Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Lisp -> Lisp Source #

nil :: Lisp Source #

The empty list.

isNull :: Lisp -> Bool Source #

Returns True if the expression is nil or the empty list.

Type Conversion

class FromLisp a where Source #

A type that can be converted from an S-expression, with the possibility of failure.

When writing an instance, use mzero or fail to make a conversion fail, e.g. the value is of the wrong type.

An example type and instance:

@data Coord { x :: Double, y :: Double }

instance FromLisp Coord where parseLisp (DotList [x] y) = pure (Coord x y) -- A non-DotList value is of the wrong shape, so use mzero to fail. parseLisp _ = mzero @

The above instance expects that Coord 4 5 is encoded as (4 . 5). This makes sense for a few special types, but most of the time the standard encoding should be used: (coord 4 5). The struct combinator provides special support for this use case:

instance FromLisp Coord where
   parseLisp = struct "coord" Coord

It uses some special type class magic to figure out the arity of its second argument.

Minimal complete definition

parseLisp

Methods

parseLisp :: Lisp -> Parser a Source #

Instances
FromLisp Bool Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Char Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Double Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Float Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Int Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Int8 Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Int16 Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Int32 Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Int64 Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Integer Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Word Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Word8 Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Word16 Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Word32 Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Word64 Source # 
Instance details

Defined in Data.AttoLisp

FromLisp () Source # 
Instance details

Defined in Data.AttoLisp

Methods

parseLisp :: Lisp -> Parser () Source #

FromLisp Text Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Number Source # 
Instance details

Defined in Data.AttoLisp

FromLisp Lisp Source # 
Instance details

Defined in Data.AttoLisp

FromLisp [Char] Source # 
Instance details

Defined in Data.AttoLisp

Methods

parseLisp :: Lisp -> Parser [Char] Source #

FromLisp a => FromLisp [a] Source # 
Instance details

Defined in Data.AttoLisp

Methods

parseLisp :: Lisp -> Parser [a] Source #

FromLisp a => FromLisp (Maybe a) Source # 
Instance details

Defined in Data.AttoLisp

Methods

parseLisp :: Lisp -> Parser (Maybe a) Source #

FromLisp (Ratio Integer) Source # 
Instance details

Defined in Data.AttoLisp

(FromLisp a, FromLisp b) => FromLisp (Either a b) Source #

Tries to parse a or, if that fails, parses a b.

Instance details

Defined in Data.AttoLisp

Methods

parseLisp :: Lisp -> Parser (Either a b) Source #

(FromLisp a, FromLisp b) => FromLisp (a, b) Source # 
Instance details

Defined in Data.AttoLisp

Methods

parseLisp :: Lisp -> Parser (a, b) Source #

(Ord a, FromLisp a, FromLisp b) => FromLisp (Map a b) Source # 
Instance details

Defined in Data.AttoLisp

Methods

parseLisp :: Lisp -> Parser (Map a b) Source #

(FromLisp a, FromLisp b, FromLisp c) => FromLisp (a, b, c) Source # 
Instance details

Defined in Data.AttoLisp

Methods

parseLisp :: Lisp -> Parser (a, b, c) Source #

data Result a Source #

The result of running a Parser.

Constructors

Error String 
Success a 
Instances
Monad Result Source # 
Instance details

Defined in Data.AttoLisp

Methods

(>>=) :: Result a -> (a -> Result b) -> Result b #

(>>) :: Result a -> Result b -> Result b #

return :: a -> Result a #

fail :: String -> Result a #

Functor Result Source # 
Instance details

Defined in Data.AttoLisp

Methods

fmap :: (a -> b) -> Result a -> Result b #

(<$) :: a -> Result b -> Result a #

Applicative Result Source # 
Instance details

Defined in Data.AttoLisp

Methods

pure :: a -> Result a #

(<*>) :: Result (a -> b) -> Result a -> Result b #

liftA2 :: (a -> b -> c) -> Result a -> Result b -> Result c #

(*>) :: Result a -> Result b -> Result b #

(<*) :: Result a -> Result b -> Result a #

Alternative Result Source # 
Instance details

Defined in Data.AttoLisp

Methods

empty :: Result a #

(<|>) :: Result a -> Result a -> Result a #

some :: Result a -> Result [a] #

many :: Result a -> Result [a] #

MonadPlus Result Source # 
Instance details

Defined in Data.AttoLisp

Methods

mzero :: Result a #

mplus :: Result a -> Result a -> Result a #

Eq a => Eq (Result a) Source # 
Instance details

Defined in Data.AttoLisp

Methods

(==) :: Result a -> Result a -> Bool #

(/=) :: Result a -> Result a -> Bool #

Show a => Show (Result a) Source # 
Instance details

Defined in Data.AttoLisp

Methods

showsPrec :: Int -> Result a -> ShowS #

show :: Result a -> String #

showList :: [Result a] -> ShowS #

Semigroup (Result a) Source # 
Instance details

Defined in Data.AttoLisp

Methods

(<>) :: Result a -> Result a -> Result a #

sconcat :: NonEmpty (Result a) -> Result a #

stimes :: Integral b => b -> Result a -> Result a #

Monoid (Result a) Source # 
Instance details

Defined in Data.AttoLisp

Methods

mempty :: Result a #

mappend :: Result a -> Result a -> Result a #

mconcat :: [Result a] -> Result a #

NFData a => NFData (Result a) Source # 
Instance details

Defined in Data.AttoLisp

Methods

rnf :: Result a -> () #

type Failure f r = String -> f r Source #

Failure continuation.

type Success a f r = a -> f r Source #

Success continuation.

data Parser a Source #

A continuation-based parser type.

Instances
Monad Parser Source # 
Instance details

Defined in Data.AttoLisp

Methods

(>>=) :: Parser a -> (a -> Parser b) -> Parser b #

(>>) :: Parser a -> Parser b -> Parser b #

return :: a -> Parser a #

fail :: String -> Parser a #

Functor Parser Source # 
Instance details

Defined in Data.AttoLisp

Methods

fmap :: (a -> b) -> Parser a -> Parser b #

(<$) :: a -> Parser b -> Parser a #

Applicative Parser Source # 
Instance details

Defined in Data.AttoLisp

Methods

pure :: a -> Parser a #

(<*>) :: Parser (a -> b) -> Parser a -> Parser b #

liftA2 :: (a -> b -> c) -> Parser a -> Parser b -> Parser c #

(*>) :: Parser a -> Parser b -> Parser b #

(<*) :: Parser a -> Parser b -> Parser a #

Alternative Parser Source # 
Instance details

Defined in Data.AttoLisp

Methods

empty :: Parser a #

(<|>) :: Parser a -> Parser a -> Parser a #

some :: Parser a -> Parser [a] #

many :: Parser a -> Parser [a] #

MonadPlus Parser Source # 
Instance details

Defined in Data.AttoLisp

Methods

mzero :: Parser a #

mplus :: Parser a -> Parser a -> Parser a #

Semigroup (Parser a) Source # 
Instance details

Defined in Data.AttoLisp

Methods

(<>) :: Parser a -> Parser a -> Parser a #

sconcat :: NonEmpty (Parser a) -> Parser a #

stimes :: Integral b => b -> Parser a -> Parser a #

Monoid (Parser a) Source # 
Instance details

Defined in Data.AttoLisp

Methods

mempty :: Parser a #

mappend :: Parser a -> Parser a -> Parser a #

mconcat :: [Parser a] -> Parser a #

parse :: (a -> Parser b) -> a -> Result b Source #

Run a Parser.

parseMaybe :: (a -> Parser b) -> a -> Maybe b Source #

Run a Parser with a Maybe result type.

parseEither :: (a -> Parser b) -> a -> Either String b Source #

Run a Parser with an Either result type.

typeMismatch Source #

Arguments

:: String

The name of the type you are trying to parse.

-> Lisp

The actual value encountered.

-> Parser a 

Fail parsing due to a type mismatch, with a descriptive message.

class ToLisp a where Source #

A type that can be converted to an S-expression.

An example type and instance:

@data Coord { x :: Double, y :: Double }

instance ToLisp Coord where toLisp (Coord x y) = struct "coord" [toLisp x, toLisp y] @

Minimal complete definition

toLisp

Methods

toLisp :: a -> Lisp Source #

Instances
ToLisp Bool Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Bool -> Lisp Source #

ToLisp Char Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Char -> Lisp Source #

ToLisp Double Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Double -> Lisp Source #

ToLisp Float Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Float -> Lisp Source #

ToLisp Int Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Int -> Lisp Source #

ToLisp Int8 Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Int8 -> Lisp Source #

ToLisp Int16 Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Int16 -> Lisp Source #

ToLisp Int32 Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Int32 -> Lisp Source #

ToLisp Int64 Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Int64 -> Lisp Source #

ToLisp Integer Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Integer -> Lisp Source #

ToLisp Word Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Word -> Lisp Source #

ToLisp Word8 Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Word8 -> Lisp Source #

ToLisp Word16 Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Word16 -> Lisp Source #

ToLisp Word32 Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Word32 -> Lisp Source #

ToLisp Word64 Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Word64 -> Lisp Source #

ToLisp () Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: () -> Lisp Source #

ToLisp Text Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Text -> Lisp Source #

ToLisp Number Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Number -> Lisp Source #

ToLisp Lisp Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Lisp -> Lisp Source #

ToLisp [Char] Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: [Char] -> Lisp Source #

ToLisp a => ToLisp [a] Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: [a] -> Lisp Source #

ToLisp a => ToLisp (Maybe a) Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Maybe a -> Lisp Source #

ToLisp (Ratio Integer) Source # 
Instance details

Defined in Data.AttoLisp

(ToLisp a, ToLisp b) => ToLisp (Either a b) Source #

No tag is used, hence type a and b must be different.

Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Either a b -> Lisp Source #

(ToLisp a, ToLisp b) => ToLisp (a, b) Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: (a, b) -> Lisp Source #

(ToLisp a, ToLisp b) => ToLisp (Map a b) Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: Map a b -> Lisp Source #

(ToLisp a, ToLisp b, ToLisp c) => ToLisp (a, b, c) Source # 
Instance details

Defined in Data.AttoLisp

Methods

toLisp :: (a, b, c) -> Lisp Source #

Constructors and destructors

mkStruct :: Text -> [Lisp] -> Lisp Source #

Create a Lisp struct in a standardised format.

Fields in a struct are accessed by position.

struct :: ParseList f a => Text -> f -> Lisp -> Parser a Source #

Decode structure serialised with mkStruct.

The second argument should be a function, usually a constructor. The resulting parser automatically figures out the arity of the function. For example:

@data Foo = Foo Int deriving (Eq, Show)

parseFoo :: Lisp -> Parser Foo parseFoo = struct "foo" Foo

test = parseMaybe parseFoo val == Just (Foo 23) where val = List [Symbol "foo", Number 23] @

Encoding and parsing

lisp :: Parser Lisp Source #

Parse an arbitrary lisp expression.

atom :: Parser Lisp Source #

Parse a symbol or a number. Symbols are expected to be utf8.