[erlang-questions] Guards syntax for multiple values

Richard O'Keefe raoknz@REDACTED
Wed Mar 27 12:41:19 CET 2019


"If there is no reason the compiler could not do it [using existing syntax]
 we *really* need new syntax."
That does not make sense.

And I shall keep on repeating
* this is the code of code which should never be written by hand
* when it is generated by a simple script, who cares what the
  generated code looks like?
With frequent mutterings of
* with this number of cases, no matter HOW you write it, the safe money
  says "it's wrong".  And it arguably is, so
* what code like this needs above all is documentation.
When you are dealing with Unicode characters, the chances are excellent
that you need to represent some characters your available fonts cannot
display, and if yours can, mine that I am reading your code with
probably cannot.

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.

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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20190328/cad53227/attachment.htm>


More information about the erlang-questions mailing list