Turns out that Scheme defines `#t` and `#f` to be `true` and `false`.
`let` is used to devife a new symbol `atom` which is a String.
`case...of` matches the literals and constructs a `LispVal` of the
appropriate type and value. `_` is a match all token.
parseAtom = do
a <- letter <|> symbol
b <- many (letter <|> digit <|> symbol)
- return $ Atom (a:b)
+ let atom = a:b
+ return $ case atom of
+ "#t" -> Bool True
+ "#f" -> Bool False
+ _ -> Atom atom
readExpr :: String -> String
readExpr input = case parse (spaces >> symbol) "lisp" input of