Utiliser TemplateHaskell pour répertorier tous les noms dans un espace de noms

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.