For some time now I've been saying that Tim and I are working on the design of some enhancements to Template Haskell. It's taken longer than I'd hoped, and we aren't done yet, but you can find a draft at http://research.microsoft.com/~simonpj/tmp/notes.ps
Great stuff! I've recently done some TH work again, so let me add something to the wish-list: Another thing that I'm really missing with the current Template Haskell is a "decent" way to pass state between different meta-functions. Let me provide a few examples of the things I want to do: I have one meta-function that generates declarations; and I have another meta function that needs to know what definitions generated by the first meta function there are (accross module boundaries). In my case, the first meta function would declare an Objective-C class and the second one would register all classes with the Objective-C runtime. Manuel Chakravarty provided me with a nice workaround involving the use of (unsafePerformIO $ newIORef ...) global variables from the Q monad. But to make that scheme work transparently, I would still need things like reifyImportedModules :: [String] -- or Q [String] reifyCurrentModuleName :: String -- or Q String And of course, using unsafePerformIO is generally not a nice thing to do, so if somebody could think of a more general solution, that would be great. Another "ugly" idiom that I've been using a lot: I have a function declareClass :: String -> String -> Q [Dec]. $(declareClass "Bar" "Foo") declares Haskell data types for an Objective-C class "Bar", which is derrived from another Objecive-C class "Foo". But it also defines super_Bar = "Foo" because another meta-function will require that information. The identifier "super_Bar" will never be explicitly used by the user of my template library. So I have lots of identifiers where the associated meta-information is stored in separate variables whose name is somehow based on the original name. It works, but all that text manipulation feels more like shell scripts than Haskell... Cheers, Wolfgang