showVal :: LispVal -> String
showVal (Atom atom) = atom
+showVal (List list) = "(" ++ unwordsList list ++ ")"
+showVal (DottedList head tail) = "(" ++ unwordsList head ++ " . " ++ showVal tail ++ ")"
showVal (Number n) = show n
showVal (String str) = "\"" ++ str ++ "\""
showVal (Character c) = "'" ++ [c] ++ "'"
showVal (Bool True) = "#t"
showVal (Bool False) = "#f"
+unwordsList :: [LispVal] -> String
+unwordsList = unwords . map showVal
+
main :: IO ()
main = do
args <- getLine