Sounds useful to me (though one might occasionally want to have
access to just the current location, without context - suggesting perhaps a list/stack of strings rather than a pre-concatenated string).

actually, there's a bit about your proposal (on the wiki page) that I don't quite follow, namely whether the annotated function versions are hand-written (needed only for making explicit use of the annotation parameter) or generated (convenient for passing on the annotation parameter). here are the use cases I can see arising:

case 1: I want to have explicit access to the call site location info

   - I write both head and headError, and the pragma
   - calls to head will be translated into calls to headError <srcLoc>,
       where I can process that information however I need to.

   {-# SRC_LOC_ANNOTATE head #-}
   head (h:_) = h

   headError srcLoc (h:_) = h
   headError srcLoc _ = error ("head of empty list: "++show srcLoc)

case 2: I have a function that calls annotated functions

   2a: I want to have explicit access to the location info

   - I write both the function and its variant, and the pragma
- calls to the function will be translated into annotated calls to its variant, I have to handle the information myself

   2b: I just want to build up call stack information

   - I write only the function, and its pragma
   - a variant is generated, affecting calls to annotated functions
       as described on the web page

case 0: I have a function with non-exhaustive left-hand sides, and I want the default branch to refer to the call site

   - I write only head, and its pragma
   - a definition of headError is generated, differing from head
       only in the extra parameter, and in the error branch which
       refers to that parameter (see case 1 for code)
   - calls to head will be translated into calls to headError <srcLoc>.

   {-# SRC_LOC_ANNOTATE head #-}
   head (h:_) = h

[instead of generating variants as separate functions, one might simply transform the originals; the default branch should also be
augmented in 2b, as in 0]

cases 1&2 are as on the wiki page, where I think 2b is suggested,
as a convenient default. case 2a would arise naturally if we annotate a function that also happens to call other annotated functions. and
case 0 is the one that started this discussion, so it would be nice not
to have to write out the boilerplate variants by hand.

does this make sense?
claus

_______________________________________________
Glasgow-haskell-users mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to