(1) Verlängern Module (von reifyModule) erhaltene Module [Modul] [Name], wobei [Module] noch der Import Liste und [Name] enthält die Liste der exportierten Namen des Moduls.
(2) Add thisModul :: Q Modul, das das aktuelle Modul erzeugt.
(3) Hinzufügen topLevelNames :: Q [Name] erzeugt eine Liste von Top-Level-Namen (sowohl exportierte als auch nicht-exportierte) gebunden in das aktuelle Modul, das sichtbar wäre zu vereinheitlichen.
(4) Fügen Sie nestedNames :: Q [Name] hinzu (benötigt einen besseren Namen), um eine Liste der Namen der nicht-obersten Ebene (verschachtelt) zu erstellen, die in diesem Kontext zu verify sichtbar sind.
(5) Fügen Sie parentNames :: Q [Name] hinzu (ebenfalls einen besseren Namen benötigend), um eine Liste der Namen zu erzeugen, die sofort dem aktuellen Spleißkontext zugeordnet sind, falls verfügbar. Beispiel: foo, bar :: $ (typeSplice) würde [foo, bar] sehen, foo = $ (exprSplice) würde [foo] sehen und $ (topLevelDecSplice) würde [] sehen.
(6) Optional IsTopLevel :: Name -> Q Bool hinzufügen, um festzustellen, ob ein Name auf der obersten Ebene (des aktuellen Moduls?) Gebunden ist. So etwas könnte alternativ durch das Durchsuchen von topLevelNames erreicht werden.
Ich bin ziemlich sicher, dass Sie dies nicht mit nur TH tun können, aber Sie können 'haskell-src-meta' verwenden, um ein Haskell-Modul als TH AST zu analysieren. – user2407038
Müsste das die Verwendung der IO-Funktionen der 'Q'-Monade erfordern, um das Modul zu laden, und dann dieses an 'haskell-src-meta' senden? Huch. Außerdem kann dies nicht eindeutig festlegen, welcher Name in dem bestimmten Bereich verwendet wird, in dem sich der Spleiß befindet. –
Ja, Sie müssen IO verwenden, um die Datei tatsächlich zu lesen. Ich bin mir nicht sicher, ob ich Ihre zweite Aussage verstehe - warum sollten Sie sich aufklären, wenn Sie * alle * Namen bekommen? Sie könnten ein Ticket für eine Feature-Anfrage öffnen, ich vermute, dass der zugrunde liegende Mechanismus, der TH antreibt, sowieso alle gültigen Namen hat. – user2407038