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