X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Text%2FRead.hs;h=5ab8877efc080a44a955175fb1f678e5f79a149d;hb=7dfe4a22aa6a2c598b1496c661c7d532aaafa94f;hp=47813eb424c37b8f4edd052b3334d005189bcd8d;hpb=7f1f4e7a695c402ddd3a1dc2cc7114e649a78ebc;p=ghc-base.git diff --git a/Text/Read.hs b/Text/Read.hs index 47813eb..5ab8877 100644 --- a/Text/Read.hs +++ b/Text/Read.hs @@ -1,32 +1,100 @@ -{-# OPTIONS -fno-implicit-prelude #-} +{-# OPTIONS_GHC -XNoImplicitPrelude #-} ----------------------------------------------------------------------------- --- +-- | -- Module : Text.Read -- Copyright : (c) The University of Glasgow 2001 --- License : BSD-style (see the file libraries/core/LICENSE) +-- License : BSD-style (see the file libraries/base/LICENSE) -- -- Maintainer : libraries@haskell.org -- Stability : provisional --- Portability : portable +-- Portability : non-portable (uses Text.ParserCombinators.ReadP) -- --- $Id: Read.hs,v 1.1 2001/06/28 14:15:04 simonmar Exp $ +-- Converting strings to values. -- --- Exiting the program. +-- The "Text.Read" library is the canonical library to import for +-- 'Read'-class facilities. For GHC only, it offers an extended and much +-- improved 'Read' class, which constitutes a proposed alternative to the +-- Haskell 98 'Read'. In particular, writing parsers is easier, and +-- the parsers are much more efficient. -- ----------------------------------------------------------------------------- module Text.Read ( - ReadS, -- String -> Maybe (a,String) - Read( - readsPrec, -- :: Int -> ReadS a - readList -- :: ReadS [a] - ), - reads, -- :: (Read a) => ReadS a - read, -- :: (Read a) => String -> a - readParen, -- :: Bool -> ReadS a -> ReadS a - lex, -- :: ReadS String + -- * The 'Read' class + Read(..), -- The Read class + ReadS, -- String -> Maybe (a,String) + + -- * Haskell 98 functions + reads, -- :: (Read a) => ReadS a + read, -- :: (Read a) => String -> a + readParen, -- :: Bool -> ReadS a -> ReadS a + lex, -- :: ReadS String + +#if defined(__GLASGOW_HASKELL__) || defined(__HUGS__) + -- * New parsing functions + module Text.ParserCombinators.ReadPrec, + L.Lexeme(..), + lexP, -- :: ReadPrec Lexeme + parens, -- :: ReadPrec a -> ReadPrec a +#endif +#ifdef __GLASGOW_HASKELL__ + readListDefault, -- :: Read a => ReadS [a] + readListPrecDefault, -- :: Read a => ReadPrec [a] +#endif + ) where #ifdef __GLASGOW_HASKELL__ +import GHC.Base import GHC.Read -#endif +import Data.Either +import Text.ParserCombinators.ReadP as P +#endif +#if defined(__GLASGOW_HASKELL__) || defined(__HUGS__) +import Text.ParserCombinators.ReadPrec +import qualified Text.Read.Lex as L +#endif + +#ifdef __HUGS__ +-- copied from GHC.Read + +lexP :: ReadPrec L.Lexeme +lexP = lift L.lex + +parens :: ReadPrec a -> ReadPrec a +parens p = optional + where + optional = p +++ mandatory + mandatory = do + L.Punc "(" <- lexP + x <- reset optional + L.Punc ")" <- lexP + return x +#endif + +#ifdef __GLASGOW_HASKELL__ +------------------------------------------------------------------------ +-- utility functions + +-- | equivalent to 'readsPrec' with a precedence of 0. +reads :: Read a => ReadS a +reads = readsPrec minPrec + +readEither :: Read a => String -> Either String a +readEither s = + case [ x | (x,"") <- readPrec_to_S read' minPrec s ] of + [x] -> Right x + [] -> Left "Prelude.read: no parse" + _ -> Left "Prelude.read: ambiguous parse" + where + read' = + do x <- readPrec + lift P.skipSpaces + return x + +-- | The 'read' function reads input from a string, which must be +-- completely consumed by the input process. +read :: Read a => String -> a +read s = either error id (readEither s) +#endif +