作为Haskell程序处理字符串

问题描述:

作为较大型大学项目的一小部分,我需要编写本质上极其粗糙的IDE。这个想法是从一个gtk文本框中获取输入,将该字符串视为在.hs文件中,并对其中的一个函数进行求值。作为Haskell程序处理字符串

我的主要方法是使用GHC API来编译和评估测试函数。我已经设法从一个.hs文件中编译一个玩具例子。 GHC的目标数据类型有一个可选的构造从一个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 

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

这种方法的另一种方法是向我推荐使用类似提示或mueval来评估文本框中的文本。如果我只想单独评估一个单独的函数,这看起来工作正常,但如果我想评估一个依赖运行同一个源文件中定义的4个其他函数的上下文的函数,这个比例是否会增加?

+1

你可能想看看ghclive在https://github.com/shapr/ghclive – Satvik

+3

你有没有看过'提示'的细节?它不仅仅是一个表达式评估器 - 它更接近GHCi,模块加载和一切。 –

+1

根据另一个Stackoverflow,[如何处理“恐慌不可能发生的事情”...](http://stackoverflow.com/questions/9242996/how-to-handle-panic-the-impossible-happened-and-continue -in-haskell)问题你应该报告一个错误。问题,你是想简单地评估盒子里的东西,还是试图将它带出ghcMonad? – Davorak

由于C.A. McCann指出,hint为你做了很多这项工作。它是GHC API的封装,而不仅仅是像mueval这样的独立评估程序。

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