3

大規模な大学プロジェクトのごく一部として、本質的に非常に粗雑な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つの関数を実行するコンテキストに依存する関数を評価したい場合は、このスケールでしょうか?

4

1 に答える 1

4

As C.A. McCann notes, hint does lots of this work for you. It's a wrapper around the GHC api, not just a standalone evaluator like mueval.

Even if it is missing something you need, it will be far easier to learn from it and extend it than start from scratch.

于 2013-02-05T00:54:30.523 に答える