7

ここに投稿されたGHCチュートリアルと、私が尋ねた以前のスタックオーバーフローの質問のアドバイスに従ってこのコードを変更した後、文字列を出力する関数printを使用してTest.hsでモジュールをコンパイルおよび実行できるプログラムを作成しましたスクリーン:

import GHC
import GHC.Paths
import DynFlags
import Unsafe.Coerce

main :: IO ()
main =
    defaultErrorHandler defaultLogAction $ do
      func <- runGhc (Just libdir) $ do
        dflags <- getSessionDynFlags
        setSessionDynFlags dflags
        target <- guessTarget "Test.hs" Nothing
        addTarget target
        r <- load LoadAllTargets
        case r of
          Failed -> error "Compilation failed"
          Succeeded -> do
            m <- findModule (mkModuleName "Test") Nothing
            setContext [IIModule m]
            value <- compileExpr ("Test.print")
            do let value' = (unsafeCoerce value) :: String -> IO ()
               return value'
      func "Hello"
      return ()

コメントに記載されているように、このコードの問題は、最初に実行したとき (Test.hs がまだコンパイルされていないとき) にしか機能しないように見えることです。コードをもう一度実行しようとすると、次のエラーが表示されます。

mkTopLevEnv: not interpreted main:Test

これは、コードが既にコンパイルされているという事実と関係があると思います。.hi ファイルと .o ファイルを削除してプログラムを再度実行すると、プログラムは正しく実行され、正しい出力が表示されます。私は何が欠けていますか?現在ghcバージョン7.4.1を使用しています

(注: GHC API を調べてみましたが、mkTopLevEnv への参照が見つかりませんでした)

4

1 に答える 1

2

サイモンマーロウはここで交換することを提案します

guessTarget "Test.hs" Nothing

guessTarget "*Test.hs" Nothing

.oファイルをロードしないようにGHCに指示するという理由で、発生するエラーを回避する必要があります。

nabbleを介してページ上のスレッド全体を見る

もちろん、毎回.hiファイルと.oファイルを削除することもできますが、それは醜い回避策です。

于 2012-10-16T01:05:30.010 に答える