Нужен учебник по использованию GHC для разбора и проверки типов Haskell

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

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

4 ответа

Решение

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

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

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

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

В документации по Haskell wiki и GHC, вероятно, есть то, что вы ищете, если вы ищете статьи. Также инструмент, который может вас заинтересовать - это подсказка для проверки синтаксиса и других вещей, касающихся вашего исходного кода.

Другие вопросы по тегам