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-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!"
于 2010-02-20T02:52:36.633 に答える
9

アダム、これはかなりタフなソリです。2006 年の開始以来、GHC API はやや文書化されていませんでした。私がお勧めするのは、GHC API を使用して作成されたいくつかの小さなアプリケーションを見つけようとすることです。質問するのに適切な場所は、おそらくGHC ユーザーのメーリング リストです。

そのようなプログラムの 1 つが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 に答える