2016-03-21 33 views
1

在GHCI中,您可以使用:add module從當前項目添加模塊,也可以使用:module + module將模塊添加到當前範圍。使用:reload命令時,使用:add加載的模塊將自動重新加載,但必須是源模塊,並且不能來自外部程序包。如何從GHCi中的「目標列表」中刪除模塊

如果您不小心使用:add而不是:module +嘗試加載模塊,則將來的重新加載始終會失敗並顯示錯誤消息,表明該模塊是封裝模塊而非源模塊。如何刪除模塊,以便重新加載可以再次成功使用,而無需通過:load重置源模塊的整個列表?

回答

2

不幸的是,:load(或:cd)是擺脫目標列表的唯一方法。唯一能夠更改目標列表的其他功能是:add,並且您知道只能添加其他目標。但是,judging by the source,修復不應該那麼辛苦。如果你願意重新編譯GHC,這樣的事情應該可以工作:

ghciCommands :: [Command] 
ghciCommands = map mkCmd [ 
    ... 
    ("rem",  keepGoingPaths removeModule, completeFilename), 
    ... 

-- | @:[email protected] command 
removeModule :: [FilePath] -> InputT GHCi() 
removeModule files = do 
    lift revertCAFs 
    files' <- mapM expandPath files 
    targets <- mapM (\m -> GHC.guessTarget m Nothing) files' 
    mapM_ GHC.removeTarget targets 
    _ <- doLoadAndCollectInfo False LoadAllTargets 
    return() 

這就是說,我還沒有嘗試過。此外,這可能值得ticket on the official tracker

+0

謝謝。閱讀文檔我認爲這可能是這種情況,但不知道我沒有錯過任何東西。 – Jules

+0

@Jules:不客氣。如果您在trac上打開票證,請[編輯]或留下評論,以便我可以更新此答案(或添加新答案)。否則,如果您沒有打開票證,我會看看我是否可以最終創建一個帳戶並提交票證並修補自己(本週或下週)。 – Zeta

+0

https://ghc.haskell.org/trac/ghc/ticket/11738 – Jules