大規模な大学プロジェクトのごく一部として、本質的に非常に粗雑なIDEを作成する必要があります。アイデアは、gtkテキストボックスから入力を受け取り、その文字列を.hsファイルにあるかのように扱い、その中の関数を評価することです。
私の主なアプローチは、GHCAPIを使用してテスト関数をコンパイルおよび評価することでした。私はすでに.hsファイルからコンパイルするためにおもちゃの例を動作させることができました。GHCのTargetデータ型には、StringBufferからターゲットを取得するためのオプションのコンストラクターがあったため、コードを変更して、StringBufferからターゲットを機能させることにしました。
compileText :: SourceView -> IO ()
compileText tview = do
txtBuff <- textViewGetBuffer tview
startIt <- textBufferGetStartIter txtBuff
endIt <- textBufferGetEndIter txtBuff
compTime <- getClockTime
srcString <- textBufferGetText txtBuff startIt endIt False
defaultErrorHandler defaultLogAction $ do
func <- runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
addTarget $ haskellFileFromText srcString compTime
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 ()
haskellFileFromText :: String -> ClockTime -> GHC.Target
haskellFileFromText codeStr cTime = GHC.Target (TargetModule (mkModuleName "Test")) False (Just ((stringToStringBuffer codeStr), cTime))
次のコードは、その時点でテキストボックスにあります。
module Test (Test.print) where
print :: String -> IO ()
print x = putStrLn x
ただし、これは機能していないようです。エラーが発生します:
textEdit: panic! (the 'impossible' happened)
(GHC version 7.4.1 for x86_64-unknown-linux):
Could not find module `Test'
Use -v to see a list of the files searched for.
Please report this as a GHC bug: http://www.haskell.org/ghc/reportabug
私は何が間違っているのですか?私はこのコードがどのように機能するかについて何かを決定的に誤解していると感じています。
私に提案されたこの方法の代わりに、ヒントやミューバルなどを使用してテキストボックス内のテキストを評価することもできます。これは、単一の関数を個別に評価したい場合は正常に機能するように見えますが、同じソースファイル内で定義された他の4つの関数を実行するコンテキストに依存する関数を評価したい場合は、このスケールでしょうか?