Je pense que le moyen le plus simple est de renoncer à ces bibliothèques Core externes et d'utiliser directement GHC en tant que bibliothèque. Sur la base de this example from the Haskell wiki, nous pouvons faire une simple fonction qui transforme un module dans le noyau:
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
Voici un exemple d'utilisation stupide qui traite sa production à compter le nombre de cas:
-- 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
Lançons il sur votre exemple:
main :: IO()
main = do
core <- compileToCore "MyNot"
print $ countCases core
Cette sortie 2, comme prévu.
Je pense que c'est une bonne question et la réponse serait intéressante pour moi aussi - je sais: la légende demande un tutoriel et c'est techniquement pas correct sur SO - d'autre part SO est souvent extrêmement hostile donc Je pense que Haskell a sa propre communauté plus agréable;) - dans ce cas: un exemple serait un ajout précieux pour référence ultérieure (donc je vote pour rouvrir) - Je souhaite vraiment des modérateurs (pas actif sur le sous-thème) attendez un peu avant de forcer les questions de fermeture (si cela va se révéler dans le spam ** puis ** fermez s'il vous plaît) – Carsten
@Carsten: documentation manquante/exemples est un déficit de la bibliothèque ou du programme et devrait être classé comme un problème là au lieu. Au fait, cette question est trop large, puisque le résultat d'analyse attendu et d'autres spécifications sont manquants. Aussi, si vous pensez qu'une question devrait être sur le sujet et a été fermée par un modérateur par erreur, assurez-vous de poster sur [meta], pas dans un commentaire (mais n'hésitez pas à lier la méta-discussion dans un commentaire) . – Zeta
@Zeta Je marche rarement dans ce nid de fourmi (MSO) - Je pensais juste que je devrais en quelque sorte expliquer mon vote pour rouvrir – Carsten