Нужен учебник для использования GHC для разбора и typecheck Haskell
Я работаю над проектом анализа кода Haskell. Я решил использовать GHC для синтаксического анализа исходного кода и определения типов, а не для написания собственного кода. Прямо сейчас я проваляюсь в документах Haddock, но это медленное движение. Кто-нибудь знает хороший учебник?
EDIT: Чтобы уточнить, я не ищу что-то вроде hlint. Я пишу свой собственный инструмент для анализа характеристик времени исполнения кода Haskell, так что, как будто я пишу другой hlint. Я ищу в основном расширение wiki-страницы GHC Как библиотека.
Ответы
Ответ 1
Адам, это довольно жесткие санки. С момента своего запуска в 2006 году API GHC был несколько недооценен. Я бы рекомендовал попробовать несколько небольших приложений, написанных с использованием API GHC. Правильное место, чтобы спросить, вероятно, это список рассылки пользователей GHC.
Одна такая программа ghctags
, которая поставляется с деревом исходных текстов GHC. Я написал оригинальную версию, но я не могу ее рекомендовать. В коде есть так много следов, что я больше не могу следовать за ней. Лучшее, что я могу сказать, это то, что, хотя это трудно понять, это по крайней мере мало и трудно следовать, намного проще, чем все GHC.
Ответ 2
Ах! нашел гораздо лучшую точку входа в документы: http://www.haskell.org/ghc/docs/latest/html/libraries/ghc-6.12.1/GHC.html
Я обновил wikipage с помощью этого примера:
Здесь мы демонстрируем вызов 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!"
Ответ 3
Если синтаксический анализ является самым важным, я рекомендую haskell-src-exts. Он разбирает все Haskell98, целую кучу расширений и очень прост в использовании.
Ответ 4
Haskell wiki и документация GHC, вероятно имеет то, что вы ищете, если ищете статьи. Кроме того, вам может быть интересен инструмент hlint, чтобы проверить синтаксис и другие особенности вашего исходного кода.