2016-03-21 3 views
1

GHCIでは、:add moduleを使用して現在のプロジェクトからモジュールを追加したり、:module + moduleを使用して現在のスコープにモジュールを追加することができます。 :addを使用してロードされたモジュールは、:reloadコマンドを使用すると自動的にリロードされますが、ソースモジュールでなければならず、外部パッケージから取得することはできません。GHCiの "target list"からモジュールを削除する方法

:module +の代わりに:addを使用してモジュールをロードしようとすると、将来のリロードは、モジュールがソースモジュールではなくパッケージモジュールであるというエラーメッセージで失敗します。 :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

@ジュール:どうぞよろしくお願いいたします。 tracでチケットを開くと、[編集]するかコメントを残すので、この回答を最新のものにすることができます(または新しい回答を追加することもできます)。それ以外の場合は、チケットを開かないと、最終的にアカウントを作成してチケットを発行して自分自身にパッチを当てるかどうかを見ていきます(今週か来週かのどちらか)。 – Zeta

+0

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

関連する問題