25

我正在研究一个分析 Haskell 代码的项目。我决定使用 GHC 来解析源代码和推断类型,而不是编写我自己的代码来做这件事。现在,我正在阅读 Haddock 文档,但进展缓慢。有谁知道好的教程吗?

编辑:澄清一下,我不是在寻找像 hlint 这样的东西。我正在编写自己的工具来分析 Haskell 代码的运行时特性,所以就像我在编写不同的 hlint。我正在寻找的基本上是 wiki 页面GHC As a library的扩展。

4

4 回答 4

10

啊! 在以下位置找到了更好的文档入口点: 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!"
于 2010-02-20T02:52:36.633 回答
9

亚当,这是相当艰难的雪橇。自 2006 年推出以来,GHC API 的文档记录一直有些不足。我建议尝试查找一些使用 GHC API 编写的小型应用程序。合适的地方可能是GHC 用户的邮件列表

一个这样的程序是ghctags随 GHC 源代码树一起提供的。我写了原始版本,但我不能推荐它——代码上有太多的脚印,我不能再跟着它了。我能说的最好的是,虽然它很难遵循,但它至少很小而且很难遵循——比所有 GHC 都简单得多。

于 2010-02-12T02:05:16.950 回答
2

如果解析是最重要的,我推荐haskell-src-exts。它解析了所有的 Haskell98,一大堆扩展,非常好用。

于 2010-02-20T04:59:16.877 回答
-1

如果您搜索文章,Haskell wiki 和 GHC 文档可能有您正在寻找内容还有一个您可能感兴趣的工具是hlint,用于检查您的源代码的语法和其他内容。

于 2010-02-11T08:52:38.033 回答