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