-- | Generate C code, use CC to compile it, and run the resulting executable
runCompiled' :: (Interp instr CGen (Param2 exp pred), HFunctor instr) =>
    ExternalCompilerOpts -> Program instr (Param2 exp pred) a -> IO ()
runCompiled' opts@(ExternalCompilerOpts {..}) prog = bracket
    (compileC opts prog)
    removeFileIfPossible
    ( \exe -> do
        maybePutStrLn externalSilent ""
        maybePutStrLn externalSilent "#### Running:"
        system exe >> return ()
    )
runCompiled' :: (Interp instr CGen (Param2 exp pred), HFunctor instr) =>
    ExternalCompilerOpts -> Program instr (Param2 exp pred) a -> IO ()
runCompiled' opts@(ExternalCompilerOpts {..}) prog = bracket
    (compileC opts prog)
    removeFileIfPossible
    ( \exe -> do
        maybePutStrLn externalSilent ""
        maybePutStrLn externalSilent "#### Running:"
        system exe >> return ()
    )
runCompiled' opts@(ExternalCompilerOpts {..}) prog = bracket
    (compileC opts prog)
    removeFileIfPossible
    ( \exe -> do
        maybePutStrLn externalSilent ""
        maybePutStrLn externalSilent "#### Running:"
        system exe >> return ()
    )