Re: New EEP draft: Pinning operator ^ in patterns

Torben Hoffmann <[email protected]>
Newsgroups gmane.comp.lang.erlang.general
Message-ID <CABf3pCnwGGb2juDVmb9Pof=1a9+W=5yGw=p2Lna4xdGuRWUeAA@mail.gmail.com>
Hi Richard,

Thanks for clarifying.
In that case my biggest worry is off the table - I have a lot of code that
would be broken by my misinterpretation, so I'm glad I misread the
discussion in this thread.

Given that the migration path doesn't break things nor take away from
binding twice in a pattern match (my biggest beef), it boils down to
whether this is a good thing to have or not.

I'm of the opinion that matching against an already bound variable should
almost exclusively be done in a function clause header or in a case clause
(as your example).
Your analysis of the OTP code base shows that this isn't used much, ie,
fixing that would be a small thing.
If you could release the code to spot these usages others could run it on
their own code base and be relieved that they don't have a huge body of
things to update.

As pinning would make the intention of the code clearer I am in favour of
introducing it.
Intention is one of the most important aspects of code maintainability and
this EEP provides that at a small cost.

Cheers,
Torben


On Tue, 19 Jan 2021 at 12:56, Richard Carlsson <[email protected]>
wrote:

> There is nothing in this suggestion that affects the reuse of the same
> variable within a pattern.
> If it's a new variable that's supposed to have the same value in both
> positions, it would look like before: "{X, X} -> ...".
> If it's an already bound variable that occurs twice in the same pattern,
> you'd mark both instances: "{^X, ^X} -> ...".
>
>         /Richard
>
>
> Den mån 18 jan. 2021 kl 08:25 skrev Torben Hoffmann <
> [email protected]>:
>
>> Hi,
>>
>> I have written a lot of code where the function clauses used having the
>> same variable twice a lot. Like, really a lot.
>>
>> f(X, X) -> ...
>>
>> This would be a real bummer to lose.
>> It makes a lot of code really concise because you push the first decision
>> to the front of your function clauses.
>>
>> Elixir allows the same, so nothing lost on that front.
>>
>> That said, I am rarely using an already bound variable in a match.
>> The only place it may come up is in a case-statement, but still, very
>> rare.
>> I - like other comments in this thread - favour small function bodies,
>> where the need for re-assignment to a variable is a lot smaller and the
>> need for matching on an already bound variable is equally small, if not
>> done in the function head.
>>
>> Erlang has, IMO, the advantage that if you've bound a variable you cannot
>> change it. That is simple to grasp.
>> In Elixir you can write
>> def funky(x, x) do
>>   x = x + 42
>>   x
>> end
>>
>> That takes a bit more explaining, which is the downside of abandoning of
>> single assignment.
>> I can live with this in Elixir because I use the same coding style (small
>> function bodies), so the need for this is small in my code.
>>
>> There are times where I miss Pascal's assignment: x := 42 means that you
>> are giving x a new value and x = 42 means comparison.
>> I haven't coded Pascal in anger for ~30 years so it may be that my memory
>> is kinder to this construct than it ought to be.
>>
>> At the end of the day I am happy with the way single assignment is
>> implemented in Erlang, so I would be slightly annoyed by the proposed
>> change, but I would be downright angry if reusing the same variable in the
>> head of a function clause was changed.
>>
>> Cheers,
>> Torben
>>
>>
>>
>>
>> On Sun, 17 Jan 2021 at 13:45, Richard O'Keefe <[email protected]> wrote:
>>
>>> Am I the only one who finds the word "pinning"
>>> confusing?  I know what "pinning a bone" means.
>>> I know what "pinning an insect to a board"
>>> means.  I know what "pinning an enemy/opponent"
>>> means in war, wrestling, or chess. I am not an
>>> Elixir programmer (the syntax has always struck
>>> me as, um, more pain than whatever other gain I
>>> might get from Elixir), so I don't know what
>>> "to pin" means in Elixir.
>>>
>>> I am also confused by it being called an operator.
>>> It appears to be an ANNOTATION, not an operator,
>>> some sort of "hey I really meant to have an
>>> already bound variable here" annotation.  It
>>> certainly doesn't *act* like an operator.
>>> If it were an operator, I'd be asking what ^X+1
>>> meant and what ^1+X meant.
>>>
>>> Since Erlang has two notions of equality, I
>>> would be much happier with an optional style
>>> rule that says "all variables in a pattern
>>> must be new" (like patterns in Haskell, SML,
>>> and so on) forcing you to show in the guard
>>> which version of equality you wanted.  This
>>> would be a pure restriction on existing
>>> Erlang syntax; any code accepted under this
>>> rule would also be acceptable under unrestricted
>>> Erlang and would have the same meaning.
>>>
>>> I note that none of the other functional
>>> languages I use (Haskell, SML, OCaml, F#)
>>> have any analogue of ^X and they don't need
>>> it.
>>>
>>> On Sun, 17 Jan 2021 at 21:18, Valentin Micic <[email protected]> wrote:
>>>
>>>>
>>>> > On 15 Jan 2021, at 17:35, Raimo Niskanen <
>>>> [email protected]> wrote:
>>>> >
>>>> …
>>>>
>>>> > 1) Would the language be a better language with a mandatory pinning
>>>> operator?
>>>> >
>>>> >
>>>>
>>>>
>>>> I think this must always be our starting point.
>>>> Without asking this question, we might wake up one day programming in
>>>> C++ (not that anything is wrong with that… well, other than esoteric
>>>> syntax).
>>>>
>>>> V/
>>>>
>>>
>>
>> --
>> http://www.linkedin.com/in/torbenhoffmann
>> @LeHoff
>>
>

-- 
http://www.linkedin.com/in/torbenhoffmann
@LeHoff
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.