[erlang-questions] Guards syntax for multiple values

Florent Gallaire fgallaire@REDACTED
Thu Mar 28 00:57:12 CET 2019


With  the Jacob "<-" operator suggestion we have:

div8([Char | Tail]) when Char <- "⅛⅜⅝⅞" -> {divisor8, Tail};

Equivalent to the "in lsit" syntax but quite confusing with the list
inside "<-" and "->".

Mixing with the Richard function header pattern matching we could have:

div8([Char <-  "⅛⅜⅝⅞" | Tail]) -> {divisor8, Tail};

No now operator needed, just using existing generator in a new place,
and looks really erlangish.

Cheers

Florent

Le mer. 27 mars 2019 à 18:20, Florent Gallaire <fgallaire@REDACTED> a écrit :
>
> > is_fraction(($½ | $⅓ | $⅔ | $¼ | $¾ | $⅕ | $⅖ | $⅗ | $⅘ | $⅙ | $⅚ | $⅐ |
> >                    $⅛ | $⅜ | $⅝ | $⅞ | $⅑ | $⅒ )) -> true;
> > is_fraction(_) -> false.
> >
> > doesn't look too bad, does it?  No new operator.  No new reserved
> > word.  It _is_ new syntax, but it is strictly more general than the
> > rather ugly 'in' special case.
>
> Yes it doesn't look bad, as I prefer function header patten matching
> to anything else.
> But your "|" syntax is already used in pattern matching;
>
> div8([Char | Tail]) when is_member("⅛⅜⅝⅞", Char) -> {divisor8, Tail};
>
> div8([Char | Tail]) when Char in "⅛⅜⅝⅞" -> {divisor8, Tail};
>
> is_member/2 and "in list" operator are really working examples.
>
> div8([$⅛ | $⅜ | $⅝ | $⅞ | Tail]) -> {divisor8, Tail};
>
> "|" as OR pattern operator doesn't work, you need a new
> operator/reserved keyword.
>
> The "in list" operator and is_member/2 guard BIF are quite equivalent.
> I prefer the "in list" syntax, probably because of my Python roots,
> but the is_member/2 guard
> is good enough to make me happy !
>
> Cheers
>
> Florent
>
> > On Tue, 26 Mar 2019 at 01:38, Florent Gallaire <fgallaire@REDACTED> wrote:
> >>
> >> Hello Richard,
> >>
> >> Thanks for your answer.
> >>
> >> > lists:member(X, [X1,X2,X3,X4]) answers true or false.
> >> > There is no fundamental reason that the compiler could not
> >> > expand that in-line to (X =:= X1 orselse ... orelse X =:= X4)
> >> > when the shape of the list is known.  So we *definitely* need
> >> > no new syntax.
> >>
> >> So if there's no reason the compiler could not do it, we *really*
> >> should have a new syntax.
> >>
> >> > We really need an actual concrete example of real code to discuss.
> >>
> >> The developed version of the is_fraction/1 function:
> >>
> >> is_fraction($½) -> true;
> >> is_fraction($⅓) -> true;
> >> is_fraction($⅔) -> true;
> >> is_fraction($¼) -> true;
> >> is_fraction($¾) -> true;
> >> is_fraction($⅕) -> true;
> >> is_fraction($⅖) -> true;
> >> is_fraction($⅗) -> true;
> >> is_fraction($⅘) -> true;
> >> is_fraction($⅙) -> true;
> >> is_fraction($⅚) -> true;
> >> is_fraction($⅐) -> true;
> >> is_fraction($⅛) -> true;
> >> is_fraction($⅜) -> true;
> >> is_fraction($⅝) -> true;
> >> is_fraction($⅞) -> true;
> >> is_fraction($⅑) -> true;
> >> is_fraction($⅒) -> true;
> >> is_fraction(_) -> false.
> >>
> >> The awful actual "with a guard" version:
> >>
> >> is_fraction(X) when X =:= $½; X =:= $⅓; X =:= $⅔; X =:= $¼; X =:= $¾;
> >> X =:= $⅕; X =:= $⅖; X =:= $⅗; X =:= $⅘; X =:= $⅙; X =:= $⅚; X =:= $⅐;
> >> X =:= $⅛; X =:= $⅜; X =:= $⅝; X =:= $⅞; X =:= $⅑; X =:= $⅒ -> true;
> >> is_fraction(_) -> false.
> >>
> >> The pretty, easy and obviously needed "with in list syntactic sugar" version :
> >>
> >> is_fraction(X) when X in "½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒" -> true;
> >> is_fraction(_) -> false.
> >>
> >> It clearly speaks for itself.
> >>
> >> Cheers.
> >>
> >> > On Mon, 25 Mar 2019 at 18:12, Florent Gallaire <fgallaire@REDACTED> wrote:
> >> >>
> >> >> Frank thanks for your answer.
> >> >>
> >> >> > You’re probably new to Erlang.
> >> >>
> >> >> Yes, but...
> >> >>
> >> >> > You can achieve the same with parse_transform:
> >> >> > https://github.com/mad-cocktail/gin/blob/master/README.rst
> >> >>
> >> >> ...I can say parse_transform is not the solution Erlang needs.
> >> >>
> >> >> > There’s no point to add new syntax to the language.
> >> >>
> >> >> Yes we need it, an easy to use built-in "in (tuple or list I'm not
> >> >> sure of the right semantic)" syntactic sugar for guards.
> >> >>
> >> >> Hope some other advices.
> >> >>
> >> >> Florent
> >> >>
> >> >> > /Frank
> >> >> >
> >> >> >> Hello everybody,
> >> >> >>
> >> >> >> I'm not very experimented in Erlang but I read carefully books and
> >> >> >> official documention.
> >> >> >>
> >> >> >> It seems to me that the guards syntax is not as good as it should be,
> >> >> >> i.e. too much verbose for multiple values.
> >> >> >>
> >> >> >> do(val1) -> val1;
> >> >> >> do(val2) -> val2;
> >> >> >> do(val3) -> val3;
> >> >> >> do(val4) -> val4;
> >> >> >> do(val5) -> val5.
> >> >> >>
> >> >> >> do(Val) when Val =:= val1; Val =:= val2; Val =:= val3; Val =:= val4;
> >> >> >> Val =:= val5 -> Val.
> >> >> >>
> >> >> >> It's boring and error prone to write.
> >> >> >>
> >> >> >> Has a "in tuple" syntax already be considered ? Something like :
> >> >> >>
> >> >> >> do(Val) when Val in {val1, val2, val3, val4, val5} -> Val.
> >> >> >>
> >> >> >> Cheers
> >> >> >>
> >> >> >> Florent
> >> >> >>
> >> >> >> --
> >> >> >> FLOSS Engineer & Lawyer
> >> >> >> _______________________________________________
> >> >> >> erlang-questions mailing list
> >> >> >> erlang-questions@REDACTED
> >> >> >> http://erlang.org/mailman/listinfo/erlang-questions
> >> >>
> >> >>
> >> >>
> >> >> --
> >> >> FLOSS Engineer & Lawyer
> >> >> _______________________________________________
> >> >> erlang-questions mailing list
> >> >> erlang-questions@REDACTED
> >> >> http://erlang.org/mailman/listinfo/erlang-questions
> >>
> >>
> >>
> >> --
> >> FLOSS Engineer & Lawyer
>
>
>
> --
> FLOSS Engineer & Lawyer



-- 
FLOSS Engineer & Lawyer



More information about the erlang-questions mailing list