Scope Locals
Andrew Haley
aph at redhat.com
Mon Apr 19 12:49:16 UTC 2021
On 4/3/21 3:27 PM, Brian Goetz wrote:
> Andrew Haley wrote:
>> I've been kicking around various ideas and implementations of scope
>> locals for some time, and I've now got something to share with the
>> wider world
>> ...
>> // Declare to scope locals x and y
>> static final ScopeLocal<MyType> x = ... ;
>> static final ScopeLocal<MyType> y = ... ;
>>
>> {
>> ScopeLocal.set(x, expr1)
>> .set(y, expr2)
>> .in(() -> ... code that uses x and y ...)
>> }
>
> This looks like a good API direction for this. It scales to multiple
> SLs, and makes it exceedingly clear what their scope is. I assume that
> if you're only setting one, you might also have a simpler form for
>
> ScopeLocal.with(x, expr, () -> code)
>
> that doesn't produce an intermediate carrier.
OK.
> Yes, this offers some flexibility. Some obvious questions, which
> probably have obvious answers:
>
> - Presumably the set() method doesn't actually set anything, but
> instead sets up a pair which will be bound before calling the in()
> - Presumably the result of SL.set() is a "carrier" that encapsulates a
> chain of bindings
> - Presumably the carrier can be reused:
>
> ScopeLocalCarrier sc = ScopeLocal.set(x, e1).set(y, e2);
> sc.in(x);
> sc.in(y);
Yes, yes, and yes. :-)
>> I'm not entirely sure about the naming here. set() is given a
>> different meaning from usual, and I'm not sure anyone would let me get
>> away with using let(). in() is slightly odd too, and perhaps something
>> more verbose would be better.
>>
>> Other possibilities are e.g.
>>
>> ScopeLocal.bind(x, expr1)
>> .bind(y, expr2)
>> .exec(() -> ... code that uses x and y ...)
>
> This naming is a definite improvement over the version above, for the
> reasons you cite. The let ... in might have been the mental model that
> kicked off this line of thinking, but the terminology may not come along
> for the ride. Perhaps `withBinding(sl, expr)`, which evokes a little
> bit of "save this for later" or "use this in that context."
For the initial JEP I'm going with John Rose's "where", so it reads like:
ScopeLocal.where(x, expr1)
.where(y, expr2)
.run(() -> ... code that uses x and y ...)
Thanks,
--
Andrew Haley (he/him)
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com>
https://keybase.io/andrewhaley
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671
More information about the loom-dev
mailing list