Нужен учебник по использованию GHC для разбора и проверки типов Haskell - PullRequest
25 голосов
/ 11 февраля 2010

Я работаю над проектом по анализу кода на Haskell. Я решил использовать GHC для разбора исходных текстов и типов, а не писать свой собственный код для этого. Прямо сейчас, я пробираюсь через документы Хэддока, но это медленно. Кто-нибудь знает хороший учебник?

РЕДАКТИРОВАТЬ: Чтобы уточнить, я не ищу что-то вроде подсказки. Я пишу свой собственный инструмент для анализа характеристик времени выполнения кода на Haskell, так что, похоже, я пишу другую подсказку. Что я ищу, так это в основном расширение вики-страницы GHC в виде библиотеки .

Ответы [ 4 ]

10 голосов
/ 20 февраля 2010

Ах! нашел гораздо лучшую точку входа в документы по адресу: 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!"
9 голосов
/ 12 февраля 2010

Адам, это довольно жесткое катание на санях. С момента своего запуска в 2006 году GHC API был несколько недокументирован. Я бы порекомендовал попробовать найти небольшие приложения, написанные с использованием GHC API. Вероятно, правильное место, чтобы спросить - это список рассылки пользователей GHC .

Одной из таких программ является ghctags, которая поставляется с исходным деревом GHC. Я написал оригинальную версию, но не могу порекомендовать ее - в коде так много следов, что я больше не могу ей следовать. Лучшее, что я могу сказать, это то, что хотя за ним трудно следовать, по крайней мере, маленький и трудно следовать - намного проще, чем все GHC.

2 голосов
/ 20 февраля 2010

Если разбор является самым важным, я рекомендую haskell-src-exts. Он анализирует весь Haskell98, целую кучу расширений и очень прост в использовании.

0 голосов
/ 11 февраля 2010

Документация Haskell wiki и GHC , вероятно, содержит то, что вы ищете, если вы ищете статьи. Также вам может понадобиться инструмент hlint для проверки синтаксиса и других аспектов вашего исходного кода.

...