2013-04-05 20 views
11

を呼び出し、以下GHC 7.4.2は、動的に私が動的にモジュールをロードして実行しようとしているモジュール

TestModule.hs

module Invoke 
     where 

import GHC 
import DynFlags 
import GHC.Paths (libdir) 
import Unsafe.Coerce (unsafeCoerce) 
import Data.Dynamic 

execFnGhc :: String -> String -> Ghc a 
execFnGhc modname fn = do 
     mod <- findModule (mkModuleName modname) Nothing 
     --setContext [IIModule mod] 
     GHC.setContext [ GHC.IIDecl $ (GHC.simpleImportDecl . GHC.mkModuleName $ modname) {GHC.ideclQualified = True} ] 
     value <- compileExpr (modname ++ "." ++ fn) 
     let value' = (unsafeCoerce value) :: a 
     return value' 
Invoke.hs

module TestModule 
     where 

evaluate = "Hello !!!" 

私のコードです

メイン2.hs

私はプログラムを実行しようとすると
import GHC.Paths (libdir) 
import GHC 
import Invoke 
-- import TestModule 

main :: IO() 
main = runGhc (Just libdir) $ do 
         str <- execFnGhc "TestModule" "evaluate" 
         return str 

それは誰かが私はこのエラーを解決する助けてください、私が行方不明です何

[[email protected] mypproj]# ./Main2 
Main2: <command line>: module is not loaded: `TestModule' (./TestModule.hs) 

わからないエラーの下に私を見る

+0

私はこれについてたくさん知らないですが、あなたは[plugins](http://hackage.haskell。 org/package/plugins)パッケージに含まれています。 – Almanildo

答えて

1

問題だろう私の考えは何かを持っています"TestModule"をロードできないときにプログラムが黙ってエラーを出して、モジュールがロードされていないと不平を言うことを示しています。すでにロードされているモジュールでexecFnGhcを試してみましたが、Text.Parsecなど自然にGHC内のモジュールをロードしようとしましたが、何かを実行しましたか?

私は自分自身をテストしますが、どこにでもGHC.Pathsライブラリは表示されません。

+0

私はリストの長さ、str < - execFnGhc "Data.List" "length [1,2,3]"を試しましたが、 "Main:Main:panic!(不可能です")という例外がスローされています (GHCバージョンx86_64版 - 不明 - Linux用7.4.2):まだ \tなしパッケージの状態:GHC.setSessionDynFlags を呼び出すGHCのバグとして報告してください:http://www.haskell.org/ghc/reportabug "から – Xinus

+0

エラー、それはあなたがGHCのために "セッションフラグ"を設定する必要がありますexecFnGhcを使用する前のように見えます。 GHCのタイプを調べてみてください。setSessionFlagsを呼び出し、 "GHC.getSessionFlags"が存在するかどうかを確認します。物事を呼び出す前にGHCはもっと多くの情報を必要としているようです。 –

0

最近、関連するGHCソースコードを読んでいましたが、既に読み込まれていない限りfindModuleはローカルモジュール(あなたの場合はTestModule.hs)で動作しません。 (リモートパッケージのモジュールでも動作します)

コンパイル済みモジュールのGHCiスタイルの動的ロードを行うには、addTargetloadを使用するのが最善です。コメントで述べたように、セッションの動的フラグも初期化する必要があります。ここにあなたのコードの実用版があります:Targetのパラメータは何ですか?最初のものはモジュール名です。 2つ目は、オブジェクトコードをロードするか、常にモジュールを解釈できるかどうかです。最後はオプションの文字列バッファで、実際のファイルのソースコードを上書きすることができます(これは不要なのでNothingです)。

私はこれをどのように把握しましたか?私は、GHCiがGHCソースコードとcompiler/main/GHC.hsでこれを実装するために使用するコードを調べました。私はこれが、あなたが望むことをGHC APIに与える方法を見つける最も信頼できる方法であることを発見しました。

混乱しますか? GHC APIはそれほど多くのものとして設計されていませんでした。

関連する問題