New EEP draft: Pinning operator ^ in patterns

Michael P. empro2@REDACTED
Thu Jan 28 20:22:37 CET 2021


On Thu, 28 Jan 2021 16:18:06 +0100
Raimo Niskanen <raimo+erlang-questions@REDACTED> wrote:

> On Thu, Jan 28, 2021 at 03:35:32PM +0100, Michael P. wrote:
> > On Wed, 27 Jan 2021 23:04:54 +0100
> > Raimo Niskanen <raimo+erlang-questions@REDACTED> wrote:
> >
> > > So have no fear, the pinning operator would not take away any feature from
> > > Erlang.  Hopefully it would give clarification to newcomers; when I first
> >
> > Sorry, but yes it would: its simplicity!
>
> But it can be argued that in this case the simplicity is only apparent,
> since the simplicity hides two fundamentally different cases.
>
> So it might in fact be too simplistic now.

Yes, right, and I still find it hard to see
which is / would be simpler.

I simply inverted the certainty of your statement and also
implied two things:
disallowing boundies from patterns as a simpler solution;
and, so far, too much neglected consequences, like
growth, overlapping with more general solutions (eval, var, ref),
leaving only `**` for `math:pow(,)`, discouraging search for
meaningful names ("that mark is enough").


> > > learned Erlang I missed some way to see the difference between binding a
> > > variable in a pattern and using an already bound variable.
> >
> > Is that not only the case with the match operator?
>
> Sorry.  Please explain.


`?? = 7, ..., {G, S} = {5, 7} %% ==> ??`

That is what intrigued me: is G bound? S? both?
If one was bound there is no obvious difference
to the unboundie, I do not like such.

But this is all about match-operator patterns --
they are special and not even mentioned in the proposal.

In all(?) other patterns the compiler


> > Do not all other patterns intoduce a new scope?
>
> Binding a variable is the start of the scope for that variable.

Do you mean extent? (Do I know what I am talking about? :-))

13> f().
ok
14> {A, A} = {1, 2}.
** exception error: no match of right hand side value {1,2}
15> A.
* 1: variable 'A' is unbound

A was bound, but not in the scope of 13 (or if so,
it has been unbound, to the same result).


> The scope ends where the function clause ends.
> Or the fun() clause.

A successful matching seems to export bindings to
the surrounding scope, a bit like the "sneak export"
in `case` patterns.

Speaking of which: only by analysising _all_ patterns of
a `case`, can such exports be recognised. Will the next
EEP suggest annotating these?


> > And friend compiler already warns about any attempt
> > at closure therein?
>
> Are you talking about fun() argument shadowing here?
> What about it?

Argument? You mean the subset of function parameters that
get bound to arguments in a call?
I call these function variables, to distinguish from other
function parameters that get bound in a different way
(getenv(), closures).
(arguments = terms = values = operands; function = operator;
e. g. 1 + 2, math:log(7))


> > The Erlang doc says:
> >
> > a) "A pattern has the same structure as a term but
> >     can contain unbound variables."
>
>       Bound variables in a pattern may/should be annotated
>       with a preceeding ^.
[...]
> I tried to complete a) above, how does that look?

Painful :-) I would really like to pretend for a while that there
was no solution (and if so `~`, not `^`, or `ref`, or even `var`
or `const` for the unboundies :-)
and concentrate on gripping the problem and finding alternatives.

Without alternatives the weight of the arguments for and against,
say `^`, cannot be assessed.

As mentioned above a term is a value; a boundie is no value but
an expression; a term cannot contain an expression but a pattern
can. It says "same structure" but anyone not knowing what is meant
will understand 'is term'.

Maybe:
"A pattern is like any term literal, but can contain both unbound
variables and variables bound in its lexical scope.

The only expressions allowed in a pattern are bound variables and
arithmetic expressions that can be compile-time evaluated to a
constant."

Blah ... I am really rooftopping the brink of my abilities here.


> > I would not want to add any explanation of a syntactical
> > annotation to that. Not even after a cleanup, as this shows
> > that it is already complicated enough.
>
> ...or that it should be explained better...

OC, it should. I meant that it is evidently already so complicated,
that one attempt of explanation has already failed. :-)


> > I am working on the examples but for now: does it not simply
> > _hide_ a need to rephrase to explicitness?
>
> Awaiting examples...

Most of my remaining notes (about a handful) concern examples.
RC was so kind to provide plenty :-)


> > By the way: Is it an operator in Elixr? If not, I would quickly
> > retreat two steps from anything and anyone having to do with Elixir.
>
> That a similar operator exists in Elixir is not in itself a valid argument
> against introducing this operator in Erlang.

I mean that people having to do with language and calling s/th
that is no operator "operator" is a bit scary.

Here is another alternative:
is there an Erlang operator (function)
that yields the term bound to a variable? If so, how about allowing
that in patterns (next to, or instead of boundies)?

~M

--

Car and cider give me a pleasant mediterranean
feeling, whereas cdr makes me shudder.






More information about the erlang-questions mailing list