Нужен учебник по использованию GHC для синтаксического анализа и проверки типов Haskell
Вопрос
Я работаю над проектом по анализу кода на Haskell.Я решил использовать GHC для анализа исходного кода и вывода типов, а не писать для этого свой собственный код.Прямо сейчас я с трудом просматриваю документы по Хэддоку, но продвигаюсь медленно.Кто-нибудь знает хороший учебник?
Редактировать:Чтобы уточнить, я не ищу что-то вроде hlint.Я пишу свой собственный инструмент для анализа характеристик времени выполнения кода на Haskell, так что это похоже на то, что я пишу другой hlint.То, что я ищу, - это, по сути, расширение вики-страницы GHC Как библиотека.
Решение
Адам, это довольно тяжелое катание на санях.С момента своего запуска в 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 выше.
--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, целую кучу расширений и очень прост в использовании.
Тот самый Хаскелл - вики и Документация GHC вероятно, здесь есть то, что вы ищете, если вы ищете статьи.Также инструментом, который вас может заинтересовать, является хлинт, для проверки синтаксиса и других сведений о вашем исходном коде.