Tell me more ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

I have been working through the exercises in a Write Yourself a Scheme in 48 Hours/Parsing and hacked together something to get parseString to comprehend escaped characters. Also had some inspiration from Real World Haskell chapter 16 minus the applicative parts.

parseString :: Parser LispVal
parseString = do char '"'
                 x <- many $ chars
                 char '"'
                 return $ String x
    where chars = escaped <|> noneOf "\""
          escaped = choice $ map tryEscaped escapedChars
          tryEscaped c = try $ char '\\' >> char (fst c) >> return (snd c)
          escapedChars = zip "bnfrt\\\"/" "\b\n\f\r\t\\\"/"

This works but I am not fond of my 'tryEscaped' definition. What are the alternatives?

share|improve this question
Is \/ really a valid escape sequence in scheme? – sepp2k May 14 '11 at 14:31

1 Answer

up vote 3 down vote accepted

Some suggestions:

  • Replace fst and snd with a pattern match or explicit function arguments.
  • Extract the common char '\\' parser. You can then avoid the try.
  • Strings with lots of escaped characters are hard to read and it's hard to visually verify that the escape codes are correctly matched with their replacements. Consider spelling them out and aligning them to make this easy to see.

Here's what I came up with:

escaped = char '\\' >> choice (zipWith escapedChar codes replacements)
escapedChar code replacement = char code >> return replacement
codes        = ['b',  'n',  'f',  'r',  't',  '\\', '\"', '/']
replacements = ['\b', '\n', '\f', '\r', '\t', '\\', '\"', '/']
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.