+nonPrintableChar :: Parser Char
+nonPrintableChar = do c <- char '\\' >> oneOf "\\nrtf"
+ return $ case c of '\\' -> '\\'
+ 'n' -> '\n'
+ 'r' -> '\r'
+ 't' -> '\t'
+ 'f' -> '\f'
+
+parseCharacter :: Parser LispVal
+parseCharacter = do char '\''
+ c <- noneOf ['\\', '\''] <|> try singleQuote <|> try nonPrintableChar
+ char '\''
+ return $ Character c
+ where
+ singleQuote = char '\\' >> char '\''
+