Re: New EEP draft: Pinning operator ^ in patterns
Kostis Sagonas <[email protected]>
| Newsgroups | gmane.comp.lang.erlang.general |
|---|---|
| Message-ID | <[email protected]> |
On 1/21/21 8:29 PM, Richard Carlsson wrote: > Den tors 21 jan. 2021 kl 17:12 skrev Kostis Sagonas <[email protected] > <mailto:[email protected]>>: > > 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