[Haskell-cafe] RFC: rewrite-with-location proposal
Eric Seidel
eric at seidel.io
Thu Feb 5 00:39:32 UTC 2015
Evan Laforge <qdunkan at gmail.com> writes:
> On Wed, Feb 4, 2015 at 3:51 PM, Eric Seidel <eric at seidel.io> wrote:
>> Yep, my original motivation was getting access to source locations
>> within embedded DSLs. The call-stack is a nice and easy extension, but
>> I'm not sure how useful it will be in practice, as the first function
>> that doesn't request a CallStack parameter will cut off the stack. This
>> means that the generated stacks will often be quite short, I imagine.
>
> Well, as I said, all I really care about is the direct caller. From
> the example in the commit, it looks like the function with the (?x ::
> Location) annotation can get its immediate caller, even if that caller
> doesn't have the annotation. If that's true, that's all that is
> needed!
That's correct, though I regrettably forgot to update the Phabricator
summary with the rename from Location to CallStack (the actual docs do
properly talk about CallStacks).
A constraint (?x :: CallStack) will always be solved for the source
location that gave rise to it, when it comes from a function signature
(as opposed to a use of the implicit param) you'll get the immediate
call-site. Furthermore, if that call-site has a CallStack implicit param
in scope, the stacks will be appended (this appending of call-stacks is
the bit that I'm not sure will see much use). Does that make sense?
> And from my point of view, it's not just "maybe useful in practice",
> but absolutely required, to the point where I wrote a custom
> preprocessor for it. I've been using it for 6 or 7 years and I sort
> of forgot that other people don't have it. I actually have no idea
> how other people do logging... just hope the message is unique and
> grep -n all the time? And for tests, manually give every single
> assertion a unique name and grep -n again? Enable TH globally? Those
> all seem impractical if you have or are expecting thousands of
> modules.
>
> I don't think it needs to be used at all in the standard libraries,
> since logging and testing are not part of base. I can understand if
> the merge window for 7.10 is closed, but trying to come up with a use
> in base shouldn't hold it up!
You're quite right, there are plenty of reasons to want this
functionality beyond error reporting, though I'd personally like to use
this for `error`, `undefined`, and `assert` as well!
More information about the Haskell-Cafe
mailing list