evalCompCmd cc (CompCmd mct nargs c) = 
  case mct of
    Nothing -> evalTcl c
    Just ct -> do
      mcmd <- getCacheCmd cc ct
      case mcmd of
        Just cmd -> eArgs >>= cmd
        Nothing  -> evalTcl c
 where eArgs = case nargs of 
                Left args -> evalArgs args
                Right al  -> evalCompArgs (evalThem cc) al
evalCompCmd cc (CompCmd mct nargs c) = 
  case mct of
    Nothing -> evalTcl c
    Just ct -> do
      mcmd <- getCacheCmd cc ct
      case mcmd of
        Just cmd -> eArgs >>= cmd
        Nothing  -> evalTcl c
 where eArgs = case nargs of 
                Left args -> evalArgs args
                Right al  -> evalCompArgs (evalThem cc) al
evalCompCmd cc (CompCmd mct nargs c) = 
  case mct of
    Nothing -> evalTcl c
    Just ct -> do
      mcmd <- getCacheCmd cc ct
      case mcmd of
        Just cmd -> eArgs >>= cmd
        Nothing  -> evalTcl c
 where eArgs = case nargs of 
                Left args -> evalArgs args
                Right al  -> evalCompArgs (evalThem cc) al