unpackEquals :: LispVal -> LispVal -> Unpacker -> ThrowsError Bool
unpackEquals arg1 arg2 (AnyUnpacker unpacker) = do
    un1 <- unpacker arg1
    un2 <- unpacker arg2
    return $ un1 == un2
  -- I like this curried const trick, used because catchError expects a function
  `catchError` (const $ return False)
unpackEquals :: LispVal -> LispVal -> Unpacker -> ThrowsError Bool
unpackEquals arg1 arg2 (AnyUnpacker unpacker) = do
    un1 <- unpacker arg1
    un2 <- unpacker arg2
    return $ un1 == un2
  -- I like this curried const trick, used because catchError expects a function
  `catchError` (const $ return False)
unpackEquals arg1 arg2 (AnyUnpacker unpacker) = do
    un1 <- unpacker arg1
    un2 <- unpacker arg2
    return $ un1 == un2
  -- I like this curried const trick, used because catchError expects a function
  `catchError` (const $ return False)