将字符串作为Haskell程序处理

3
作为大学项目的一部分,我需要编写一个非常简陋的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

我做错了什么?我感觉我对这段代码的工作方式存在重大误解。
有人向我建议,可以使用类似 hint 或 mueval 的东西来评估文本框中的文本。如果我只想独立地评估单个函数,则这似乎可以正常工作,但如果我想评估依赖于在同一源文件中定义的其他4个函数运行上下文的函数,这是否可行?

1
你可能想看看 ghclive,网址是:https://github.com/shapr/ghclive。 - Satvik
3
你实际上有详细查看过hint吗?它不仅仅是一个表达式求值器,更接近于GHCi,包括模块加载等功能。 - C. A. McCann
1
根据另一个Stackoverflow中的问题,如何处理“panic the impossible happened”...,你应该报告一个bug。问题是,你是试图简单地评估盒子里的内容还是正在尝试将其从ghcMonad中取出? - Davorak
1个回答

4
作为C.A. McCann指出的,hint会为您完成大部分工作。它是GHC API的包装器,而不仅仅是像mueval一样的独立评估器。
即使它缺少您需要的某些功能,从它学习并扩展它也比从头开始要容易得多。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接