boolBinop :: (LispVal -> ThrowsError a) -> (a -> a -> Bool) -> [LispVal] -> ThrowsError LispVal
boolBinop unpacker op [a1, a2] = do
  left <- unpacker a1
  right <- unpacker a2
  return $ Bool $ left `op` right
boolBinop :: (LispVal -> ThrowsError a) -> (a -> a -> Bool) -> [LispVal] -> ThrowsError LispVal
boolBinop unpacker op [a1, a2] = do
  left <- unpacker a1
  right <- unpacker a2
  return $ Bool $ left `op` right
boolBinop unpacker op [a1, a2] = do
  left <- unpacker a1
  right <- unpacker a2
  return $ Bool $ left `op` right