Подтвердить что ты не робот

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

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

EDIT: Чтобы уточнить, я не ищу что-то вроде hlint. Я пишу свой собственный инструмент для анализа характеристик времени исполнения кода Haskell, так что, как будто я пишу другой hlint. Я ищу в основном расширение wiki-страницы GHC Как библиотека.

4b9b3361

Ответ 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, чтобы проверить синтаксис и другие особенности вашего исходного кода.