[英]How can I parse GHC core?
我認為最簡單的方法是放棄這些外部核心庫,直接使用GHC作為庫。 基於Haskell wiki中的這個示例 ,我們可以創建一個將模塊轉換為Core的簡單函數:
import GHC
import GHC.Paths (libdir)
import HscTypes (mg_binds)
import CoreSyn
import DynFlags
import Control.Monad ((<=<))
compileToCore :: String -> IO [CoreBind]
compileToCore modName = runGhc (Just libdir) $ do
setSessionDynFlags =<< getSessionDynFlags
target <- guessTarget (modName ++ ".hs") Nothing
setTargets [target]
load LoadAllTargets
ds <- desugarModule <=< typecheckModule <=< parseModule <=< getModSummary $ mkModuleName modName
return $ mg_binds . coreModule $ ds
這是一個愚蠢的示例用法,用於處理其輸出以計算案例數:
-- Silly example function that analyzes Core
countCases :: [CoreBind] -> Int
countCases = sum . map countBind
where
countBind (NonRec _ e) = countExpr e
countBind (Rec bs) = sum . map (countExpr . snd) $ bs
countExpr (Case e _ _ alts) = countExpr e + sum (map countAlt alts)
countExpr (App f e) = countExpr f + countExpr e
countExpr (Lam _ e) = countExpr e
countExpr (Let b e) = countBind b + countExpr e
countExpr (Cast e _) = countExpr e
countExpr (Tick _ e) = countExpr e
countExpr _ = 0
countAlt (_, _, rhs) = 1 + countExpr rhs
讓我們在你的例子中運行它:
main :: IO ()
main = do
core <- compileToCore "MyNot"
print $ countCases core
按預期輸出2。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.