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 <christheke...@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-core+unsubscr...@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/CAK-y3Cvu_z6GDONRTgRYw4G8oDnCw%2BitMkgn7n%3D%2B2z%2Bn_ATfng%40mail.gmail.com.

Reply via email to