On 10/03/2018 01:24 PM, Fred Hebert wrote:
I guess an empty pattern is not possible?

   begin
    Whom <~ id({ok,"world"}),
    <~ io:format("Hello, ~p!\n", [Whom])
   end


It would be possible. There's a unary '+' and '-' prefix operator, and I figure it should be possible to declare '<~' both as infix and prefix.
begin
    A + B,
    + 5,
    A <~ B,
    <~ B,
end

It does look a bit odd, but I do not think there is any case where it would be syntactically or grammatically ambiguous to use.

I think we'd be trading one kind of magic feeling (`_` can be used for both `{ok, _}` and `ok`) for another one (a unary unbind operator), but there would certainly be a clearer semantic distinction between `ok` and `{ok, _}`.

I just hadn't considered keeping the same operator both as infix and unary, but I'm certainly open to the idea.

What would be left to decide is whether introducing the operator would replace the currently proposed '_ <~ Exp' matching on 'ok' semantics or supplement it. I think it would make sense to replace it for that case wholesale.

What troubles me about this `_ <~ Exp` is that it changes the meaning of `_` in this context. `_ = Expr` matches everything, I would therefore expect `_ <~ Exp` to work for every valid expression, that is `ok | {ok, _}`.

But then some confusion can also arise if you're going to use `_Var` (where _Var is not defined), which will not behave the way it does in every other context since it won't work for `ok` (while `_` would in my expectations).

The unary does not help much, it can indicate that `ok` is expected, but doesn't make `_` or `_Var` any more obvious.

I think you may well have an unresolvable conflict there as far as consistency is concerned. You might as well require the developer to write an explicit an `ok | {ok, _}` on the left side, at least there won't be any surprises. And if you do this, then `_` can be used to accept both `ok` and `{ok, _}`, however infrequent.

This simplifies greatly the reading of <~ since it now succeeds when `ok | {ok, _}`, fails gracefully when `error | error_tuple()` and crashes when any other value. On top of that the left-hand side may result in a badmatch if variables were already defined.

And if you're writing it explicitly there's little against accepting `ok | ok_tuple()` either.

Cheers,

--
Loïc Hoguin
https://ninenines.eu
_______________________________________________
eeps mailing list
[email protected]
http://erlang.org/mailman/listinfo/eeps

Reply via email to