تحتاج إلى برنامج تعليمي لاستخدام GHC لتحليل و Typecheck Haskell
سؤال
أنا أعمل في مشروع لتحليل كود Haskell. قررت استخدام GHC لتحليل أنواع المصدر والنتائج بدلا من كتابة الرمز الخاص بي للقيام بذلك. الآن، أنا أشمل من خلال مستندات الحدوق، لكنها تذهب بطيئا. لا أحد يعرف برامج تعليمية جيدة؟
تحرير: للتوضيح، أنا لا أبحث عن شيء مثل hlint. أنا أكتب أداةي الخاصة لتحليل خصائص وقت تشغيل رمز Haskell، لذلك فهي مثل أكتب الإقليم المختلفة. ما أبحث عنه هو أساسا التوسع في صفحة الويكي GHC كمكتبة.
المحلول
آدم، هذا هو شلاع قوي جدا. منذ إطلاقها في عام 2006، كان API GHC غير منتظم إلى حد ما. ما أوصي به هو محاولة العثور على بعض التطبيقات الصغيرة التي تمت كتابتها باستخدام API GHC. المكان المناسب للسؤال هو ربما القائمة البريدية للمستخدمين GHC.
هذا البرنامج هو ghctags
, ، التي تشحن مع شجرة مصدر GHC. كتبت النسخة الأصلية، لكنني لا أستطيع أن أوصي به، فهناك العديد من آثار أقدام على الكود الذي لم أعد أستطيع متابعته. أفضل ما يمكنني قوله هو أنه على الرغم من صعوبة اتباعه، إلا أنه على الأقل صغير ويصعب اتباع أبسط بكثير من كل من GHC.
نصائح أخرى
آه! وجدت نقطة دخول أفضل بكثير في المستندات في: http://www.haskell.org/ghc/docs/latest/html/libraries/ghc-6.12.1/gh.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، كومة كاملة من الامتدادات وسهلة الاستخدام للغاية.
ال Haskell Wiki. و وثائق جي سي ربما لديه ما تبحث عنه إذا كنت تبحث عن المقالات. أيضا أداة قد تكون مهتما بها هي هيلينت, ، للتحقق من بناء الجملة وأشياء أخرى حول شفرة المصدر الخاصة بك.