将字符串视为Haskell程序

时间:2013-01-09 16:10:08

标签: haskell gtk ghc dynamic-compilation ghc-api

作为一个较大的大学项目的一小部分,我需要编写本质上非常粗糙的IDE。我们的想法是从gtk文本框中获取输入,将该字符串视为在.hs文件中,并评估其中的函数。

我的主要方法是使用GHC API来编译和评估测试函数。我已经设法得到一个玩具示例,用于从.hs文件进行编译。 GHC的Target数据类型有一个可选的构造函数,用于从StringBuffer获取目标,所以我决定尝试改变我的代码,使其从String Buffer中运行:

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

我做错了什么?我觉得我对这段代码的工作方式有些误解。

我建议使用此方法的替代方法是使用类似提示或mueval之类的方法来评估文本框中的文本。如果我只是想单独评估单个函数,这似乎工作正常,但如果我想评估一个依赖于在同一源文件中定义运行4个其他函数的上下文的函数,这会扩展吗?

1 个答案:

答案 0 :(得分:4)

作为C.A. McCann指出,hint为你做了很多这方面的工作。它是围绕GHC api的包装器,而不仅仅是像mueval这样的独立评估器。

即使它缺少你需要的东西,也可以比从头开始学习它并扩展它容易得多。

相关问题