我正在开发一个分析Haskell代码的项目。我决定使用GHC来解析源代码并推断类型而不是编写我自己的代码来做到这一点。现在,我正在通过Haddock文档,但它进展缓慢。有谁知道一个很好的教程?
编辑:澄清一下,我不是在找像hlint这样的东西。我正在编写自己的工具来分析Haskell代码的运行时特性,所以就像我正在编写一个不同的hlint。我正在寻找的基本上是维基页面GHC As a library的扩展。
答案 0 :(得分:10)
啊!在以下文档中找到了更好的切入点: http://www.haskell.org/ghc/docs/latest/html/libraries/ghc-6.12.1/GHC.html
我使用此示例更新了wikipage:
这里我们演示调用parseModule,typecheckModule,desugarModule,getNamesInScope和getModuleGraph。这适用于haskell-platform,ghc-6.12.1。
错误:libdir是硬编码的。见上面的ghc-paths。
--A.hs
--invoke: ghci -package ghc A.hs
import GHC
import Outputable
--import GHC.Paths ( libdir )
import DynFlags ( defaultDynFlags )
libdir = "/usr/local/lib/ghc-6.12.1"
targetFile = "B.hs"
main = do
res <- example
print $ showSDoc ( ppr res )
example =
defaultErrorHandler defaultDynFlags $ do
runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
target <- guessTarget targetFile Nothing
setTargets [target]
load LoadAllTargets
modSum <- getModSummary $ mkModuleName "B"
p <- parseModule modSum
t <- typecheckModule p
d <- desugarModule t
l <- loadModule d
n <- getNamesInScope
c <- return $ coreModule d
g <- getModuleGraph
mapM showModule g
return $ (parsedSource d,"/n-----/n", typecheckedSource d)
--B.hs
module B where
main = print "Hello, World!"
答案 1 :(得分:9)
一个这样的程序是ghctags
,它与GHC源代码树一起提供。我写了原始版本,但我不推荐它 - 代码上有太多的脚印,我不能再遵循它了。我能说的最好的是,虽然它很难遵循,但至少小并且很难遵循 - 比所有GHC都简单得多。
答案 2 :(得分:2)
如果解析是最重要的,我推荐haskell-src-exts。它解析了所有Haskell98,一大堆扩展,非常易于使用。
答案 3 :(得分:-1)
如果您搜索文章,Haskell wiki和GHC documentation可能就是您要找的内容。您可能感兴趣的工具是hlint,用于检查源代码的语法和其他内容。