Je veux une fonction TemplateHaskell variablesInScope :: Q [Name]
qui renvoie une liste des Name
de toutes les variables de la scope. TemplateHaskell a évidemment cette information disponible pour implémenter des fonctions comme reify :: Name -> Q Info
et lookupValueName :: Ssortingng -> Q (Maybe Name)
.
Est-ce que la fonction que je veux existe quelque part et que je viens de la négliger? Ou peut-il être facilement construit en quelque sorte?
Malheureusement, vous ne pouvez pas le faire avec TH
seul. Essayez le haskell-src-meta
pour parsingr le module Haskell en tant que TH AST
.
Cela nécessitera les fonctionnalités IO de la monade Q
pour charger le module.
S’il vous plaît référence https://ghc.haskell.org/trac/ghc/ticket/9699#ticket pour voir les spécifications approximatives actuelles
(1) Étendre ModuleInfo (obtenu à partir de reifyModule) à ModuleInfo [Module] [Nom], où [Module] est toujours la liste d’importation et [Nom] contient la liste des noms exportés du module.
(2) Ajoutez thisModule :: Q Module produisant le module actuel.
(3) Ajoutez topLevelNames :: Q [Name] pour générer une liste de noms de niveau supérieur (exportés et non exportés) liés au module en cours qui seraient visibles à réifier.
(4) Ajoutez nestedNames :: Q [Name] (nécessitant un meilleur nom) pour générer une liste des noms non nesteds (nesteds) visibles dans ce contexte.
(5) Ajouter parentNames :: Q [Name] (nécessitant également un meilleur nom) produisant une liste des noms immédiatement associés au contexte d’épissage actuel, le cas échéant. Par exemple, foo, bar :: $ (typeSplice) verrait [foo, bar], foo = $ (exprSplice) verrait [foo] et $ (topLevelDecSplice) verrait [].
(6) Facultatif Ajouter isTopLevel :: Name -> Q Bool pour détecter si un nom est lié au niveau supérieur (du module actuel?). Quelque chose comme cela pourrait alternativement être accompli en cherchant dans topLevelNames.