On Mon, Feb 25, 2013 at 4:42 PM, Simon Peyton-Jones <simonpj@microsoft.com> wrote:

I’m afraid the rewrite-rule idea won’t work.  RULES are applied during optimisation, when tons of inlining has happened and the program has been shaken around a lot. No reliable source location information is available there.

 


Do you mean that the proposal itself won't work, or specifically implementing this features in terms of existing rewrite rules won't work?
 

One thing I'd disagree with on that page is point (3). While it's certainly nice to have a full stack trace, implementing just shallow call information is incredibly useful. For logging and test framework usages, it in fact completely covers the use case. And even for debugging, I think it would be a massive step in the right direction.

I'll admit to ignorance on the internals of GHC, but it seems like doing the shallow source location approach would be far simpler than a full trace. I'd hate to lose a very valuable feature because we can't implement the perfect feature.
 

One idea I had, which that page does not yet describe, is to have an implicit parameter,
something like ?loc::Location, with

          errLoc :: ?loc:Location => String -> a

          errLoc s = error (“At “ ++ ?loc ++ “\n” ++ s)

 

This behave exactly like an ordinary implicit parameter, EXCEPT that if there is no binding for ?loc::Location, then the current location is used.  Thus

 

myErr :: ?loc:Location => Int -> a

myErr n = errLoc (show n)

 

foo :: Int -> int

foo n | n<0 = myErr n

        | otherwise = ...whatever...

 

When typechecking ‘foo’ we need ?loc:Location, and so the magic is that we use the location of the call of myErr in foo.

 

Simon

 

 

 

From: haskell-cafe-bounces@haskell.org [mailto:haskell-cafe-bounces@haskell.org] On Behalf Of Alexander Kjeldaas
Sent: 25 February 2013 12:16
To: Simon Hengel
Cc: Haskell Cafe
Subject: Re: [Haskell-cafe] RFC: rewrite-with-location proposal

 

On Mon, Feb 25, 2013 at 12:46 PM, Simon Hengel <sol@typeful.net> wrote:

On Mon, Feb 25, 2013 at 10:40:29AM +0100, Twan van Laarhoven wrote:
> I think there is no need to have a separate REWRITE_WITH_LOCATION
> rule. What if the compiler instead rewrites 'currentLocation' to the
> current location? Then you'd just define the rule:
>
> {-# REWRITE "errorLoc" error = errorLoc currentLocation #-}

REWRITE rules are only enabled with -O.  Source locations are also
useful during development (when you care more about compilation time
than efficient code and hence use -O0).  So I'm not sure whether it's a
good idea to lump those two things together.

 

I could imagine that source locations being useful when debugging rewrite rules for example.

 

I think your argument makes sense, but why not fix that specifically?

 

{-# REWRITE ALWAYS "errorLoc" error = errorLoc currentLocation #-}

 

Alexander

 


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe