レイアウトを少し変更しましたが、検討中のコード例は次のとおりです。
parseNumber =
liftM (Number . read) $
choice [many1 digit, char '#' >> oneOf "hd" >>= a]
where
a f =
case f of
'h' -> many1 digit
物事がどのように連携するべきかを知る前に、同時に多くのことをしようとしていると思います. 読み取っていた数字の種類に応じて、どうにかして areadHex
を の(Number . read)
代わりにパーツに移動する必要があります。read
liftM
これは、または他の派手なコンビネータを使用しない16進数のパーサーです。
parseHex :: Parser LispVal
parseHex = do
char '#'
char 'x'
digits <- many1 hexDigit -- hexDigit is defined by Parsec.
return (Number (fst (readHex digits !! 0)))
ここで注意が必要なのは、 の結果の抽出ですreadHex
。
パーサーを組み合わせることができます
try parseHex <|> try parseOct <|> ... <|> parseDec
または、チューニングとインライン化、および Parsec の多くのツールに夢中になります。しかし、私は基本から始めます。