import Control.Monad
import Text.ParserCombinators.Parsec hiding (spaces)
import System.Environment
+import Numeric
data LispVal = Atom String
| List [LispVal]
_ -> Atom atom
parseNumber :: Parser LispVal
-parseNumber = do ds <- many1 digit
- let a = read ds
+parseNumber = do toNum <- radix
+ ds <- many1 digit
+ let ((a,_):_) = toNum ds
return $ Number a
+ where radix = do r <- try (char '#' >> oneOf "bodx") <|> return 'd'
+ return $ case r of
+ 'd' -> readDec
+ 'x' -> readHex
+ 'o' -> readOct
+ 'b' -> readInt 2 (\x -> elem x "01") (read . (:[]))
parseExpr :: Parser LispVal
parseExpr = parseString
- <|> parseAtom
<|> parseNumber
+ <|> parseAtom
readExpr :: String -> String
readExpr input = case parse parseExpr "lisp" input of