New EEP draft: Pinning operator ^ in patterns
Kostis Sagonas
kostis@REDACTED
Thu Jan 21 21:09:21 CET 2021
On 1/21/21 8:29 PM, Richard Carlsson wrote:
> Den tors 21 jan. 2021 kl 17:12 skrev Kostis Sagonas <kostis@REDACTED
> <mailto:kostis@REDACTED>>:
>
> On 1/21/21 3:41 PM, Richard Carlsson wrote:
> > Some weird code becomes obvious when annotated.
> >
> > What does this line do?
> >
> > _ = [M = M:module_info(module) || M <- Needed],
> >
> > Oh, it's a multi-assertion!
> >
> > _ = [^M = M:module_info(module) || M <- Needed],
>
> I disagree.
>
> This is _exactly_ the kind of code where you do *not* want such an
> annotation. You want to rewrite this to something like:
>
> true = lists:all(fun (M) -> M =:= M:module_info(module) end,
> Needed),
>
> No matching is required here.
>
>
> I never said it was good code, did I? I said it was weird code, which
> *exists today* in the OTP codebase, and that thanks to the annotation it
> at least became more obvious what it did. Now that we see what it does,
> it's easier to say "this probably ought to be rewritten". Your version
> isn't great however, because when it crashes it won't reveal which M did
> not match, just that one of them didn't.
Are you sure? Doesn't lists:all/2 short-circuit?
My (naive?) impression would be that it would stop in the first M where
the comparison did not return true.
Kostis
More information about the erlang-questions
mailing list