Leider kann man das nicht TH
alleine machen. Versuchen Sie haskell-src-meta
, das Haskell-Modul als zu analysieren TH AST
.
Q
Zum Laden des Moduls sind jedoch die E / A-Funktionen der Monade erforderlich .
Bitte beziehen Sie sich auf https://ghc.haskell.org/trac/ghc/ticket/9699#ticket , um die aktuelle grobe Spezifikation zu sehen
(1) Erweitern Sie ModuleInfo (von reifyModule bezogen) auf ModuleInfo [Module] [Name], wobei [Module] weiterhin die Importliste ist und [Name] die Liste der exportierten Namen des Moduls enthält.
(2) Fügen Sie dieses Modul :: Q-Modul hinzu, das das aktuelle Modul erzeugt.
(3) Fügen Sie topLevelNames :: Q [Name] hinzu, um eine Liste der Namen der obersten Ebene (sowohl exportiert als auch nicht exportiert) zu erstellen, die im aktuellen Modul gebunden sind und für die Überprüfung sichtbar wären.
(4) Fügen Sie nestedNames :: Q [Name] hinzu (benötigt einen besseren Namen), um eine Liste der nicht verschachtelten (nicht verschachtelten) Namen zu erstellen, die in diesem Kontext zur Überprüfung sichtbar sind.
(5) Fügen Sie parentNames :: Q [Name] hinzu (auch wenn ein besserer Name erforderlich ist), um eine Liste der Namen zu erstellen, die unmittelbar mit dem aktuellen Spleißkontext verknüpft sind, sofern verfügbar. Zum Beispiel würde foo, bar :: $ (typeSplice) [foo, bar] sehen, foo = $ (exprSplice) würde [foo] sehen und $ (topLevelDecSplice) würde [] sehen.
(6) Optional Fügen Sie isTopLevel :: Name -> Q Bool hinzu, um festzustellen, ob ein Name auf der obersten Ebene (des aktuellen Moduls?) Gebunden ist. So etwas könnte alternativ durch Durchsuchen von topLevelNames erreicht werden.
haskell-src-meta
ein Haskell-Modul als TH AST analysieren.