Нужен учебник по использованию 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, вероятно, есть то, что вы ищете, если вы ищете статьи. Также инструмент, который может вас заинтересовать - это подсказка для проверки синтаксиса и других вещей, касающихся вашего исходного кода.