我正在研究一个分析 Haskell 代码的项目。我决定使用 GHC 来解析源代码和推断类型,而不是编写我自己的代码来做这件事。现在,我正在阅读 Haddock 文档,但进展缓慢。有谁知道好的教程吗?
编辑:澄清一下,我不是在寻找像 hlint 这样的东西。我正在编写自己的工具来分析 Haskell 代码的运行时特性,所以就像我在编写不同的 hlint。我正在寻找的基本上是 wiki 页面GHC As a library的扩展。
我正在研究一个分析 Haskell 代码的项目。我决定使用 GHC 来解析源代码和推断类型,而不是编写我自己的代码来做这件事。现在,我正在阅读 Haddock 文档,但进展缓慢。有谁知道好的教程吗?
编辑:澄清一下,我不是在寻找像 hlint 这样的东西。我正在编写自己的工具来分析 Haskell 代码的运行时特性,所以就像我在编写不同的 hlint。我正在寻找的基本上是 wiki 页面GHC As a library的扩展。
啊! 在以下位置找到了更好的文档入口点: http ://www.haskell.org/ghc/docs/latest/html/libraries/ghc-6.12.1/GHC.html
我用这个例子更新了维基页面:
这里我们演示调用 parseModule、typecheckModule、desugarModule、getNamesInScope 和 getModuleGraph。这适用于 haskell 平台,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!"
亚当,这是相当艰难的雪橇。自 2006 年推出以来,GHC API 的文档记录一直有些不足。我建议尝试查找一些使用 GHC API 编写的小型应用程序。合适的地方可能是GHC 用户的邮件列表。
一个这样的程序是ghctags
随 GHC 源代码树一起提供的。我写了原始版本,但我不能推荐它——代码上有太多的脚印,我不能再跟着它了。我能说的最好的是,虽然它很难遵循,但它至少很小而且很难遵循——比所有 GHC 都简单得多。
如果解析是最重要的,我推荐haskell-src-exts。它解析了所有的 Haskell98,一大堆扩展,非常好用。