ここに投稿された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 への参照が見つかりませんでした)