Thank you for explaining that makes sense.

My final reservation would be that everywhere else in Elixir when you see `=` 
it's a pattern match. Does this break that? Would this (contrived) example be 
valid?:

for reduce {%{start: count}, sum} = {%{start: 0}, 0}, count < 100, i <- [1, 2, 
3] do
  {count + 1, i + sum}
end


Best

Adam


> On 21 Dec 2021, at 13:03, José Valim <jose.va...@dashbit.co> wrote:
> 
>  
> In the examples given I can't see how they are different from using reduce 
> with a tuple as an accumulator, eg:
> 
> ```
> for i <- [1, 2, 3], reduce: {0, 0}  do
>   {doubled, sum} -> {i * 2, i + sum}
> end
> ```
> 
> There is some confusion here. "reduce" cannot return the modified list, so 
> the example above is not doing what you expect it to. However, let's assume 
> you want to write this instead:
> 
> for i <- [1, 2, 3], reduce: {0, 0}  do
>   {count, sum} -> {count + 1, i + sum}
> end
> 
> Then you are right, they are not different. In the reduce case, it is a 
> different syntax to achieve the same thing. So you may ask: why change?
> 
> I think there are two benefits to the proposed syntax:
> 
> 1. Collocating variable declaration with initialization
> 
> In your example, you need pass the initial value in one place and then the 
> names they receive is elsewhere:
> 
> for i <- [1, 2, 3], reduce: {0, 0}  do
>   {count, sum} -> {count + 1, i + sum}
> end
> 
> For example, we could change it to this to address this issue:
> 
> for i <- [1, 2, 3], reduce: {count, sum} = {0, 0}  do
>   {count + 1, i + sum}
> end
>  
> 2. By declaring the variables that are part of reduce prior to the 
> generators, they can be used as part of the filters. So we can further change 
> the code above to this:
> 
> for reduce {count, sum} = {0, 0}, i <- [1, 2, 3]do
>   {count + 1, i + sum}
> end
> 
> And that would allow us to, for example, count only the first 100:
> 
> for reduce {count, sum} = {0, 0}, count < 100, i <- [1, 2, 3] do
>   {count + 1, i + sum}
> end
> 
> Furthermore, I would say declaring reduce upfront is better, because you 
> don't need to read all generators and filters to figure out what the 
> comprehension will actually return.
> 
> So there is more we can do with the new syntax, but from the point of view of 
> inputs/outputs, they are equivalent. The implicit variable assignment is 
> gone. The only downside of the proposed syntax compared to the current one is 
> that the current one makes it easier if you want to have multiple clauses. 
> But it is not such a common case and you could use a "case ... do" as well.
> 
> In other words, even if we are not to add "for let", I would say this version 
> of reduce is superior and it should be considered in itself.
> 
> 
> -- 
> 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 
> <mailto:elixir-lang-core+unsubscr...@googlegroups.com>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4LmhgA%3De9_vZ8_1eyv3gjsUsArYZH31388s-%3D%2BY-uUM5Q%40mail.gmail.com
>  
> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4LmhgA%3De9_vZ8_1eyv3gjsUsArYZH31388s-%3D%2BY-uUM5Q%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/C323C525-09D2-4586-9FC4-269F6CFF49B6%40a-corp.co.uk.

Reply via email to