gpt4 book ai didi

haskell - 将字符串视为 Haskell 程序

转载 作者:行者123 更新时间:2023-12-02 10:23:16 25 4
gpt4 key购买 nike

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

我的主要方法是使用 GHC API编译和评估测试函数。我已经设法获得了一个可以从 .hs 文件进行编译的玩具示例。 GHC 的目标数据类型有一个可选的构造函数,用于从 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 个其他函数的上下文的函数,这种规模会好吗?

最佳答案

作为 C.A. McCann 指出,hint 可以为您完成很多这样的工作。它是 GHC api 的包装器,而不仅仅是像 mueval 这样的独立评估器。

即使它缺少您需要的东西,从中学习和扩展它也会比从头开始容易得多。

关于haskell - 将字符串视为 Haskell 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14241424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com