*Re: Allen Madsen*

It's curious that for supports the match clause *{key, value} = option* 
works but *option = {key, value} *does not.
This feels like a bug in the implementation. (Interestingly, both 
formulations work in the *->* clause.) I will open a github issue for 
further discussion.

*Re: in general*

The thing we can't do today using that match clause feature in *for* today is 
"guarded clauses" (ie failing rather than filtering with a guard 
mechanism). There's no place to put the guard, so this necessitates a new 
construct.

Today a guard in the *<-* clause acts as a filter, and you can't attach a 
guard to a match clause. We can't use *with*'s *else* mechanism because we 
don't expect data shapes in multi-clause *for*s to have universally 
addressable failure modes. (That rules out my *for -> else* proposal above.)

I'm beginning to arrive at the conclusion that we'd definitely need to 
introduce a new construct for this (if we decide to proceed). I prefer:

*every {key, value} when is_integer(value) <- [a: 1, b: "2"], do: {key, 
value+1}# EveryClauseError: no clause matching {:b, "2"}*

On Tuesday, June 15, 2021 at 1:51:11 PM UTC-7 Allen Madsen wrote:

> Re: Christopher Keele
>
> > Another option would be extending *for* to accept matches and set 
> bindings in its macro's list of clauses, like *with* (which also mixes 
> *<-* with *=*)
>
> This is already supported. You can do:
>
> list = [1]
> for option <- list, {key, value} = option do
>   {option, key, value}
> end
>
> Allen Madsen
> http://www.allenmadsen.com
>
>
> On Tue, Jun 15, 2021 at 2:50 PM Christopher Keele <christ...@gmail.com> 
> wrote:
>
>> Re: Zachary
>>
>> > I’d rather just see:
>> > 
>> >* for var <- list do*
>> >*   %{destructured: data} = var*
>> >* end*
>>
>> My understanding is that part of the intent is to have a way to surface 
>> hard requirements about the data shape to the top level of the construct, 
>> so it doesn't get lost within the block. I agree I'd prefer this convention 
>> over the addition of new constructs or operators increasing the surface 
>> area language, but if it was added to the language I'd use the feature 
>> since I imagine that'd become the new convention.
>>
>> On Tuesday, June 15, 2021 at 11:47:18 AM UTC-7 Christopher Keele wrote:
>>
>>> Another option would be extending *for* to accept matches and set 
>>> bindings in its macro's list of clauses, like *with* (which also mixes 
>>> *<-* with *=*)
>>>
>>> list = [1]
>>> for option <- list, option = {key, value} do
>>>   {option, key, value}
>>> end
>>> # proposal would raise runtime MatchError
>>> # today raises compiletime CompileError: undefined function key/0
>>>
>>> I actually like this even more than the other proposals I've advocated 
>>> for. It'd bring the only other *<-* operator-using-construct (*for*) 
>>> closer to the featureset of *with* and raises the intuitive *MatchError* 
>>> instead of the *ForClauseError* that would be more consistent with 
>>> other implementations.
>>>
>>> On Tuesday, June 15, 2021 at 10:51:19 AM UTC-7 zachary....@gmail.com 
>>> wrote:
>>>
>>>> Ultimately if we don’t prefer the operator, I’d rather just see:
>>>>
>>>> for var <- list do
>>>>   %{destructured: data} = var
>>>> end
>>>>
>>>> Over the `for!` operator. I don’t know why the operator seems so much 
>>>> better than `for!` to me though.
>>>>
>>>> On Jun 15, 2021, at 1:45 PM, Stefan Chrobot <ste...@chrobot.io> wrote:
>>>>
>>>> Ideally, <- and = would have the same semantics in "for" and "with", 
>>>> but I'm not sure how confusing "for {:ok, post} = posts, do: ..." would be.
>>>>
>>>> Given all that, I find "for!" to be the best approach, except for the 
>>>> name. As stated before, a bang version feels like a precedent. I think 
>>>> "fors" ("for strict") is better (like def and defp), or maybe a totally 
>>>> different name for a loop (while?, loop?, rep?, iter?).
>>>>
>>>> wt., 15 cze 2021 o 19:06 José Valim <jose....@dashbit.co> napisał(a):
>>>>
>>>>> I am against introducing a new operator because I think that will be 
>>>>> just unclear. Regardless if we pick "<!-" or "<<-", I don't think the 
>>>>> notation would be clear to everyone reading the code. Between for!, a 
>>>>> strict option, and the operator, the operator is, in my opinion, the most 
>>>>> unreadable.
>>>>>
>>>>> Furthermore, the operator doesn't have a use in "with", because "with" 
>>>>> can use = for strict matches.
>>>>>
>>>>>
>>>>> On Tue, Jun 15, 2021 at 6:59 PM Stefan Chrobot <ste...@chrobot.io> 
>>>>> wrote:
>>>>>
>>>>>> How about an "else" block for the items that don't match?
>>>>>>
>>>>>> for {:ok, item} <- items do
>>>>>>   # ...
>>>>>> else
>>>>>>   # ...
>>>>>> end
>>>>>>
>>>>>> This would be consistent with <- in "with". I'm assuming the 
>>>>>> intention would be to prefer "for!" over "for" for most of the cases so 
>>>>>> the 
>>>>>> issue with this is a need to figure out a terse syntax for raising a 
>>>>>> MatchError without having to type something like "else _ -> raise 
>>>>>> MatchError"; plus also include what was being attempted in the error 
>>>>>> message. Is "else raise" an option?
>>>>>>
>>>>>> Best,
>>>>>> Stefan
>>>>>>
>>>>>> niedz., 13 cze 2021 o 14:06 Adam Lancaster <ad...@a-corp.co.uk> 
>>>>>> napisał(a):
>>>>>>
>>>>>>> That makes sense!
>>>>>>>
>>>>>>> I guess you could make a new operator available outside of the `for` 
>>>>>>> too, like back in a `with`...  Maybe `<-!` 
>>>>>>>
>>>>>>> Best
>>>>>>>
>>>>>>> Adam
>>>>>>>
>>>>>>>
>>>>>>> On 11 Jun 2021, at 19:11, Paul Schoenfelder <
>>>>>>> paulscho...@fastmail.com> wrote:
>>>>>>>
>>>>>>> In my opinion, internal consistency is part of the mental model, so 
>>>>>>> inconsistency reflects a flaw in the model. That said, I think that's 
>>>>>>> probably talking past you on this a bit, and I get what your point is: 
>>>>>>> ultimately if it is reasonably intuitive, consistency can be allowed to 
>>>>>>> fall by the wayside a bit. I guess where I disagree is that I'm not 
>>>>>>> sure 
>>>>>>> this will intuitive for someone not already steeped in the language. 
>>>>>>> The 
>>>>>>> point I was getting at by comparing `for` and `with` is that they both 
>>>>>>> make 
>>>>>>> use of the same `<-` operator in a way that is consistent across both 
>>>>>>> forms, but with `for!` that falls apart.
>>>>>>>
>>>>>>> Now back to `for!`. Even though it looks just like `for`, the `<-` 
>>>>>>> operator starts to behave like `=`. If you are skimming code and happen 
>>>>>>> to 
>>>>>>> miss the single character difference between the two (`for` vs `for!`), 
>>>>>>> you 
>>>>>>> will wind up with a very different idea about what the same code does. 
>>>>>>> The 
>>>>>>> human brain is terrible at distinguishing small differences like this, 
>>>>>>> it's 
>>>>>>> why you can typo things like `behavior` and `behaviour` and read right 
>>>>>>> over 
>>>>>>> it without noticing, sometimes even when you are _trying_ to notice 
>>>>>>> those 
>>>>>>> things.
>>>>>>>
>>>>>>> I think it would be far better for us to use a new operator in place 
>>>>>>> of `<-`, rather than a new special form that looks basically identical 
>>>>>>> to 
>>>>>>> an existing one, but works differently in subtle ways. Not to mention, 
>>>>>>> the 
>>>>>>> operator approach would allow one to mix both `<-` and the new operator 
>>>>>>> together in the same `for`, should it be useful to do so. In any case, 
>>>>>>> I 
>>>>>>> don't really have a strong opinion on what that operator is 
>>>>>>> specifically, 
>>>>>>> but I am much more in favor of that direction, than I am `for!`.
>>>>>>>
>>>>>>> Paul
>>>>>>>             
>>>>>>>
>>>>>>> On Fri, Jun 11, 2021, at 9:24 AM, Adam Lancaster wrote:
>>>>>>>
>>>>>>> I'm definitely sympathetic to that idea.
>>>>>>>
>>>>>>> I think part of what internal consistency buys us is predictability 
>>>>>>> and therefore a quicker path to a good mental model about what the code 
>>>>>>> is 
>>>>>>> going to do. But the mental model is the more important thing. Which is 
>>>>>>> just to say if we don't have internal consistency but we can get to a 
>>>>>>> good 
>>>>>>> mental model, then I think it might be okay.
>>>>>>>
>>>>>>> I think given other functions that follow the same idea, seeing a 
>>>>>>> `for!` would certainly communicate "right this is expected to raise 
>>>>>>> under 
>>>>>>> some condition" - at least to me. 
>>>>>>>
>>>>>>> There's also not an obvious way to have `for` mimic `with` when I 
>>>>>>> think about it because say you do this:
>>>>>>>
>>>>>>> ```
>>>>>>> for [a, _] = [1, 2], do: ... 
>>>>>>> ```
>>>>>>>
>>>>>>> there is no way to distinguish it from a filter - where `=` should 
>>>>>>> not raise a match error.
>>>>>>>
>>>>>>> I think you'd have to more clearly de-mark the difference between 
>>>>>>> the generators and the filters, which feels like a big change.
>>>>>>>
>>>>>>>
>>>>>>> Best
>>>>>>>
>>>>>>> Adam
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On 11 Jun 2021, at 00:13, Paul Schoenfelder <
>>>>>>> paulscho...@fastmail.com> wrote:
>>>>>>>
>>>>>>> I’m generally in favor of the option to have stricter semantics, but 
>>>>>>> to me the introduction of `for!` feels out of sync with other special 
>>>>>>> forms, none of which are bang-form. Furthermore, especially in contrast 
>>>>>>> to 
>>>>>>> `with`, you end up with this weird dichotomy with the `<-` operator, 
>>>>>>> where 
>>>>>>> sometimes it means a filtering match, and other times where it means 
>>>>>>> strict 
>>>>>>> match. That kind of syntactical inconsistency in a language feels like 
>>>>>>> a 
>>>>>>> bad precedent to set, despite what feels like a reasonable compromise. 
>>>>>>> It’s 
>>>>>>> also notable to me that there are easy ways to program defensively to 
>>>>>>> force 
>>>>>>> match errors if you want them, within the current syntax, but obviously 
>>>>>>> that comes at the cost of more verbosity.
>>>>>>>
>>>>>>> I’m not sure what the right answer is, but this feels to me like 
>>>>>>> rushing to solve a specific problem without spending enough time 
>>>>>>> considering how it meshes with the rest of the language in terms of 
>>>>>>> cognitive complexity, particularly for those new to the language.
>>>>>>>
>>>>>>> Anyway, that’s my two cents. I’m a fan of the concept for sure, but 
>>>>>>> would almost prefer to see the semantics changed in a major version 
>>>>>>> bump, 
>>>>>>> to match `with`, even if that meant manually updating a bunch of my 
>>>>>>> code, 
>>>>>>> because at least it keeps the language self consistent. I’ll admit I’m 
>>>>>>> probably an outlier on that though.
>>>>>>>
>>>>>>> Paul 
>>>>>>>
>>>>>>> On Thu, Jun 10, 2021, at 6:16 PM, Christopher Keele wrote:
>>>>>>>
>>>>>>> That's fair enough! Though from my perspective both for! and strict: 
>>>>>>> true would be about equally far from the <- where matches fail. But 
>>>>>>> I can see the keyword format getting lost in the filters and other 
>>>>>>> keywords.
>>>>>>>
>>>>>>> On Thu, Jun 10, 2021 at 3:14 PM José Valim <jose....@dashbit.co> 
>>>>>>> wrote:
>>>>>>>
>>>>>>> Sorry, I meant to someone reading the code. The strict option is 
>>>>>>> modifying the behavior of the operator <-, which may be quite before it 
>>>>>>> in 
>>>>>>> the text.
>>>>>>>
>>>>>>> I prefer for! in this case as it is upfront.
>>>>>>>
>>>>>>> On Fri, Jun 11, 2021 at 00:09 Christopher Keele <christ...@gmail.com> 
>>>>>>> wrote:
>>>>>>>
>>>>>>> > My concern with :strict is that it changes the behavior 
>>>>>>> considerably of the generators but it may show up only quite later on, 
>>>>>>> far 
>>>>>>> from them, especially if you have multiple filters.
>>>>>>>
>>>>>>> Could you elaborate? I don't quite think I understand, particularly 
>>>>>>> *"[the 
>>>>>>> behaviour] may show up only quite later on"*
>>>>>>>
>>>>>>> Does "quite later" here refer to code distance (the MatchError's 
>>>>>>> stacktrace would point away from/bury the for location)? Or 
>>>>>>> temporal distance?
>>>>>>>
>>>>>>> On Thursday, June 10, 2021 at 2:58:03 PM UTC-7 José Valim wrote:
>>>>>>>
>>>>>>> My concern with :strict is that it changes the behavior considerably 
>>>>>>> of the generators but it may show up only quite later on, far from 
>>>>>>> them, 
>>>>>>> especially if you have multiple filters.
>>>>>>>
>>>>>>>
>>>>>>> On Thu, Jun 10, 2021 at 23:56 Christopher Keele <christ...@gmail.com> 
>>>>>>> wrote:
>>>>>>>
>>>>>>> > for {:ok, num} <- list, strict: true, do: num
>>>>>>>
>>>>>>> Agreed, this is more or less exactly what I was pitching.
>>>>>>> On Wednesday, June 9, 2021 at 10:16:25 PM UTC-7 tal...@gmail.com 
>>>>>>> wrote:
>>>>>>>
>>>>>>> I would like to add a solution within the existing language:
>>>>>>>
>>>>>>>
>>>>>>> ```elixir
>>>>>>>
>>>>>>> > list = [{:ok, 1}, {:ok, 2}, {:error, :fail}, {:ok, 4}]
>>>>>>> > for el <- list, do: ({:ok, num} = el; num)
>>>>>>> ** (MatchError) no match of right hand side value: {:error, :fail}
>>>>>>> ```
>>>>>>> I think this is reasonable.
>>>>>>>
>>>>>>> Acctually the built in filtering in `for` caught me off guard, I was 
>>>>>>> expecting for to fail unless all elements matched. So for me the better 
>>>>>>> solution would be to always make matching in `for` strict. But I guess 
>>>>>>> this 
>>>>>>> is too late now for backwards compatibility. Another alternative to 
>>>>>>> `for!` 
>>>>>>> would be:
>>>>>>>
>>>>>>> ```elixir
>>>>>>>
>>>>>>> > list = [{:ok, 1}, {:ok, 2}, {:error, :fail}, {:ok, 4}]
>>>>>>> > for {:ok, num} <- list, strict: true, do: num
>>>>>>> ** (MatchError) no match of right hand side value: {:error, :fail}
>>>>>>> ```
>>>>>>>
>>>>>>> I don't like the use of the exclamation mark in `for!` because it 
>>>>>>> has little meaning relative to the existing use of the exclamation mark 
>>>>>>> in 
>>>>>>> Elixir.
>>>>>>>
>>>>>>> onsdag 9. juni 2021 kl. 13:17:04 UTC+2 skrev ad...@a-corp.co.uk:
>>>>>>>
>>>>>>> I also love the proposal.
>>>>>>>
>>>>>>> It's a shame we can't re-use the `with` semantics of `=` raising a 
>>>>>>> match error in the for.
>>>>>>>
>>>>>>> My two cents is `for!` makes the most sense, and follows the 
>>>>>>> conventions of other functions.
>>>>>>>
>>>>>>> Best
>>>>>>>
>>>>>>> Adam
>>>>>>>
>>>>>>>
>>>>>>> On 8 Jun 2021, at 18:18, Christopher Keele <christ...@gmail.com> 
>>>>>>> wrote:
>>>>>>>
>>>>>>> This feature would be very useful, I've experience this 
>>>>>>> signature-change pain point before too (and kind of have been avoiding 
>>>>>>> `for` ever since, TBH).
>>>>>>>
>>>>>>> I'm reluctant to increase the surface area of the language itself, 
>>>>>>> what do you think about adding a `:strict` option to `for` instead of a 
>>>>>>> new 
>>>>>>> special form/kernel macro/operator?
>>>>>>> On Monday, June 7, 2021 at 9:50:45 AM UTC-7 eric.meado...@gmail.com 
>>>>>>> wrote:
>>>>>>>
>>>>>>> ## Background
>>>>>>>
>>>>>>> `for` comprehensions are one of the most powerful features in 
>>>>>>> Elixir. It supports both enumerable and bitstring generators, filters 
>>>>>>> through boolean expressions and pattern matching, collectibles with 
>>>>>>> `:into` 
>>>>>>> and folding with `:reduce`.
>>>>>>>
>>>>>>> One of the features are automatic filtering by patterns in 
>>>>>>> generators:
>>>>>>>
>>>>>>> ```elixir
>>>>>>> list = [{:ok, 1}, {:ok, 2}, {:error, :fail}, {:ok, 4}]
>>>>>>> for {:ok, num} <- list, do: num
>>>>>>> #=> [1, 2, 4]
>>>>>>> ```
>>>>>>>
>>>>>>> Generator filtering is very powerful because it allows you to 
>>>>>>> succinctly filter out data that is not relevant to the comprehension in 
>>>>>>> the 
>>>>>>> same expression that you are generating elements out of your 
>>>>>>> enumerable/bitstrings. But the implicit filtering can be dangerous 
>>>>>>> because 
>>>>>>> changes in the shape of the data will silently be removed which can 
>>>>>>> cause 
>>>>>>> hard to catch bugs.
>>>>>>>
>>>>>>> The following example can show how this can be an issue when testing 
>>>>>>> `Posts.create/0`. If a change causes the function to start returning 
>>>>>>> `{:ok, 
>>>>>>> %Post{}}` instead of the expected `%Post{}` the test will pass even 
>>>>>>> though 
>>>>>>> we have a bug.
>>>>>>>
>>>>>>> ```elixir
>>>>>>> test "create posts" do
>>>>>>>   posts = Posts.create()
>>>>>>>   for %Post{id: id} <- posts, do: assert is_integer(id)
>>>>>>> end
>>>>>>> ```
>>>>>>>
>>>>>>> The example uses a test to highlight the issue but it can just as 
>>>>>>> well happen in production code, specially when refactoring in other 
>>>>>>> parts 
>>>>>>> of the code base than the comprehension.
>>>>>>>
>>>>>>> Elixir is a dynamically typed language but dynamic typing errors are 
>>>>>>> less of an issue compared to many other dynamic languages because we 
>>>>>>> are 
>>>>>>> usual strict in the data we accept by using pattern matching and guard 
>>>>>>> functions. `for` is by design not strict on the shape of data it 
>>>>>>> accepts 
>>>>>>> and therefor loses the nice property of early failure on incorrect data.
>>>>>>>
>>>>>>> ## Proposal
>>>>>>>
>>>>>>> I propose an alternative comprehension macro called `for!` that has 
>>>>>>> the same functionality as `for` but instead of filtering on patterns in 
>>>>>>> generators it will raise a `MatchError`.
>>>>>>>
>>>>>>> ```elixir
>>>>>>> posts = [{:ok, %Post{}}]
>>>>>>> for! %Post{id: id} <- posts, do: assert is_integer(id)
>>>>>>> #=> ** (MatchError) no match of right hand side value: {:ok, %Post{}}
>>>>>>> ```
>>>>>>>
>>>>>>> Pattern matching when not generating values with `=` remains 
>>>>>>> unchanged.
>>>>>>>
>>>>>>> `for!` gives the developer an option to be strict on the data it 
>>>>>>> accepts instead of silently ignoring data that does not match.
>>>>>>>
>>>>>>> ## Other considerations
>>>>>>>
>>>>>>> You can get strict matching with `for` today by first assigning to a 
>>>>>>> variable. This way you can also mix filtering and strict matching 
>>>>>>> patterns.
>>>>>>>
>>>>>>> ```elixir
>>>>>>> posts = [{:ok, %Post{}}]
>>>>>>> for post <- posts,
>>>>>>>     %Post{id: id} = post,
>>>>>>>     do: assert is_integer(id)
>>>>>>> #=> ** (MatchError) no match of right hand side value: {:ok, %Post{}}
>>>>>>> ```
>>>>>>>
>>>>>>> Another alternative is to introduce a new operator such as `<<-` 
>>>>>>> (the actual token can be anything, `<<-` is only used as an example) 
>>>>>>> for 
>>>>>>> raising pattern matches instead of introducing a completely new macro.
>>>>>>>
>>>>>>> ```elixir
>>>>>>> posts = [{:ok, %Post{}}]
>>>>>>> for %Post{id: id} <<- posts, do: assert is_integer(id)
>>>>>>> #=> ** (MatchError) no match of right hand side value: {:ok, %Post{}}
>>>>>>> ```
>>>>>>>
>>>>>>> A downside of adding new functions or macros is that it doesn't 
>>>>>>> compose as well compared to adding options (or operators) to existing 
>>>>>>> functions. If we want to add another variant of comprehensions in the 
>>>>>>> future we might be in the position that we need 4 macros, and then 8 
>>>>>>> and so 
>>>>>>> on.
>>>>>>>
>>>>>>> Another benefit of adding an operator is that you can mix both `<-` 
>>>>>>> and `<<-` in a single comprehension.
>>>>>>>
>>>>>>> The downside of an operator is that it adds more complexity for the 
>>>>>>> language user. We would also need an operator that is visually close to 
>>>>>>> `<-` but still distinctive enough that they are easy to separate since 
>>>>>>> their behavior are very difference.
>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>> Groups "elixir-lang-core" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>> send an email to elixir-lang-co...@googlegroups.com.
>>>>>>> To view this discussion on the web visit 
>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/42adcfba-12d8-4469-a156-f412b0d290a9n%40googlegroups.com
>>>>>>>  
>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/42adcfba-12d8-4469-a156-f412b0d290a9n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>> Groups "elixir-lang-core" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>> send an email to elixir-lang-co...@googlegroups.com.
>>>>>>>
>>>>>>> To view this discussion on the web visit 
>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/f4d5c0be-567a-4a7d-9b39-68202226c788n%40googlegroups.com
>>>>>>>  
>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/f4d5c0be-567a-4a7d-9b39-68202226c788n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>> Groups "elixir-lang-core" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>> send an email to elixir-lang-co...@googlegroups.com.
>>>>>>> To view this discussion on the web visit 
>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/0ce03abc-61bb-4423-b6a8-704d1d62169fn%40googlegroups.com
>>>>>>>  
>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/0ce03abc-61bb-4423-b6a8-704d1d62169fn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>>> You received this message because you are subscribed to a topic in 
>>>>>>> the Google Groups "elixir-lang-core" group.
>>>>>>> To unsubscribe from this topic, visit 
>>>>>>> https://groups.google.com/d/topic/elixir-lang-core/LEUD2alHPiE/unsubscribe
>>>>>>> .
>>>>>>> To unsubscribe from this group and all its topics, send an email to 
>>>>>>> elixir-lang-co...@googlegroups.com.
>>>>>>> To view this discussion on the web visit 
>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4K01hBRkjLaRPj5ktViNNjYqdFbKdysvFcDVG%3DgBp78dA%40mail.gmail.com
>>>>>>>  
>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4K01hBRkjLaRPj5ktViNNjYqdFbKdysvFcDVG%3DgBp78dA%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>> Groups "elixir-lang-core" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>> send an email to elixir-lang-co...@googlegroups.com.
>>>>>>> To view this discussion on the web visit 
>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/CAD9kT2QPn_prFiS%2BR9eemqA43DMvvOB8NrAweL2PgE_ZR2g6Cg%40mail.gmail.com
>>>>>>>  
>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAD9kT2QPn_prFiS%2BR9eemqA43DMvvOB8NrAweL2PgE_ZR2g6Cg%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>> Groups "elixir-lang-core" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>> send an email to elixir-lang-co...@googlegroups.com.
>>>>>>> To view this discussion on the web visit 
>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/8a6cf634-cda5-4445-8230-4b7b69ed5ca8%40www.fastmail.com
>>>>>>>  
>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/8a6cf634-cda5-4445-8230-4b7b69ed5ca8%40www.fastmail.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>> Groups "elixir-lang-core" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>> send an email to elixir-lang-co...@googlegroups.com.
>>>>>>> To view this discussion on the web visit 
>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/65609056-4A25-45FA-B91F-84D4DF292129%40a-corp.co.uk
>>>>>>>  
>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/65609056-4A25-45FA-B91F-84D4DF292129%40a-corp.co.uk?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>> Groups "elixir-lang-core" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>> send an email to elixir-lang-co...@googlegroups.com.
>>>>>>> To view this discussion on the web visit 
>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/4f04033a-d509-460e-8205-ad23e1251b1e%40www.fastmail.com
>>>>>>>  
>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/4f04033a-d509-460e-8205-ad23e1251b1e%40www.fastmail.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>> Groups "elixir-lang-core" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>> send an email to elixir-lang-co...@googlegroups.com.
>>>>>>> To view this discussion on the web visit 
>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/CE301440-828B-41A5-B388-75CD6FF94699%40a-corp.co.uk
>>>>>>>  
>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/CE301440-828B-41A5-B388-75CD6FF94699%40a-corp.co.uk?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>>
>>>>>> -- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "elixir-lang-core" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to elixir-lang-co...@googlegroups.com.
>>>>>> To view this discussion on the web visit 
>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/CACzMe7b6srxk_vE45h-qY--g61t-Lzqgvix46jX2GxQRE46FGA%40mail.gmail.com
>>>>>>  
>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/CACzMe7b6srxk_vE45h-qY--g61t-Lzqgvix46jX2GxQRE46FGA%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>> .
>>>>>>
>>>>>
>>>>> -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "elixir-lang-core" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to elixir-lang-co...@googlegroups.com.
>>>>> To view this discussion on the web visit 
>>>>> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4KFQ_2BNCXmFdJuxJC2XWD-hSpbod5_wt%2Bka%3DSBpfFcpg%40mail.gmail.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4KFQ_2BNCXmFdJuxJC2XWD-hSpbod5_wt%2Bka%3DSBpfFcpg%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>
>>>> -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "elixir-lang-core" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to elixir-lang-co...@googlegroups.com.
>>>>
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/elixir-lang-core/CACzMe7YNuuhqq9S%2BJu6W_829XVBbPZar9vj5pAjkcan99NO82w%40mail.gmail.com
>>>>  
>>>> <https://groups.google.com/d/msgid/elixir-lang-core/CACzMe7YNuuhqq9S%2BJu6W_829XVBbPZar9vj5pAjkcan99NO82w%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>>
>>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "elixir-lang-core" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to elixir-lang-co...@googlegroups.com.
>>
> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/elixir-lang-core/ea66088e-445f-40d9-a9d3-702a700fb623n%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/elixir-lang-core/ea66088e-445f-40d9-a9d3-702a700fb623n%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/dbc2b3fa-d9b9-49f4-ba59-34805a630660n%40googlegroups.com.

Reply via email to