Oh, and if you don't have `reduce` then it just becomes the first thing, e.g

```

for foo ← [1, 2, 3], state: %{counter: 0} do
state →
{some_calc(acc, state.counter), %{state | counter: state.counter + 1}}
end
```

Sent via Superhuman ( https://sprh.mn/?vip=zachary.s.dan...@gmail.com )

On Fri, Dec 17, 2021 at 12:59 PM, Zach Daniel < zachary.s.dan...@gmail.com > 
wrote:

> 
> I may not fully be understanding what we're looking for here, but it seems
> like this would effectively be the equivalent of:
> 
> 
> 
> ```
> result =
> for foo ← [1, 2, 3], reduce: %{acc: [], counter: 0} do
> %{acc: acc, counter: counter} ->
> new_acc = some_calc(acc)
> %{acc: new_acc, counter: counter + 1}
> end
> 
> actual_result = result.acc
> ```
> 
> 
> 
> I'm wondering if we could just introduce an additional `state` that you
> match on, and return as a tuple from the for loop body? I think this is
> similar to what the original proposal wanted, but it involves only knowing
> that if you use the `state` option, you need to return a tuple of the for
> loop result and the new state. And it looks similar to a genserver in that
> regard, which makes it feel reasonably conventional.
> 
> 
> 
> ```
> result =
> 
> for foo ← [1, 2, 3], reduce: [], state: %{counter: 0} do
> 
> acc, state →
> {some_calc(acc, state.counter), %{state | counter: state.counter + 1}}
> 
> end
> 
> ```
> 
> 
> 
> 
> 
> 
> Sent via Superhuman ( https://sprh.mn/?vip=zachary.s.dan...@gmail.com )
> 
> 
> 
> 
> On Fri, Dec 17, 2021 at 10:35 AM, João Pedro Evangelista < evangelistajoaop@
> gmail. com ( evangelistajo...@gmail.com ) > wrote:
> 
>> > In fact, making special-semantics different syntactically to be more
>> googleable
>> 
>> 
>> Also more easily scannable while reading the code, we would know that this
>> variable has more meaning among the other ones
>> 
>> On Friday, December 17, 2021 at 9:32:18 AM UTC-3 christ...@gmail.com
>> wrote:
>> 
>> 
>>> > I did consider introducing (precisely) $ for variables but my concern is
>>> that, by introducing special syntax, I believe most would expect it to be
>>> fully mutable, so you can modify it from any scope.
>>> 
>>> 
>>> I am not sure if I can envision a way to allow imperative-ish variables
>>> without introducing special semantics. So I feel like supporting the new
>>> semantics with special syntax would allow us to set correct expectations
>>> about its scope and mutability when introducing/documenting it!
>>> 
>>> 
>>> 
>>> In fact, making special-semantics different syntactically to be more
>>> googleable is a perk over plain variables in my mind. For example,
>>> searching "ruby double at" (a comparatively oblique ruby language
>>> identifier feature, @@class_variables ), returns an appropriate top result
>>> (
>>> https://stackoverflow.com/questions/5890118/what-does-variable-mean-in-ruby
>>> ) (from an incognito browser session, no less)! So maybe an "elixir dollar
>>> variable" google search is a reasonable standard to hold ourselves to.
>>> 
>>> 
>>> On Friday, December 17, 2021 at 5:40:14 AM UTC-5 sabi... @ gmail. com wrote:
>>> 
>>> 
>>> 
>>>> Indeed this doesn't address the issue of the level of nesting, and is
>>>> confusing in this case.
>>>> 
>>>> 
>>>> 
>>>> The new syntax could maybe include the level of nesting information
>>>> somehow, e,g. ` *$section_counter* ` in the parent loop, ` 
>>>> *$$section_counter*
>>>> ` in the child loop...?
>>>> 
>>>> Or *$1.section_counter = 1* (parent), **$2.section_counter = 1** (child)? 
>>>> ****
>>>> (slightly inspired by &1) **.
>>>> **
>>>> 
>>>> 
>>>> Another way to deal with this inconsistency could be to forbid nested
>>>> comprehension with variables, and require to extract as a new function (in
>>>> the same way the & cannot be nested and require to use fn). **
>>>> **
>>>> Most examples would probably ** be easier to understand this way anyway,
>>>> but this might limit the power of the feature.
>>>> 
>>>> 
>>>> 
>>>> Or maybe just having the compiler raising an error if trying to re-assign
>>>> within a nested block, with a helpful beginner-friendly message, could be
>>>> enough to clear this confusion?
>>>> 
>>>> I think this is not so much harder to figure than the fact than a
>>>> re-assignment within an *if* doesn't work as in imperative languages.
>>>> 
>>>> 
>>>> 
>>>> By looking at the examples here, I feel that the last one might be the
>>>> most elegant of these 3 ideas: https:/ / gist. github. com/ sabiwara/ 
>>>> 97c480c2076666ba9b98cf7a142a5a0f
>>>> ( https://gist.github.com/sabiwara/97c480c2076666ba9b98cf7a142a5a0f )
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> Le ven. 17 déc. 2021 à 16:14, José Valim < jose.... @ dashbit. co > a écrit
>>>> :
>>>> 
>>>> 
>>>>> *Re: for section <- sections, $section_counter = 1 , $lesson_counter = 1
>>>>> do*
>>>>> 
>>>>> 
>>>>> 
>>>>> I did consider introducing (precisely) $ for variables but my concern is
>>>>> that, by introducing special syntax, I believe most would expect it to be
>>>>> fully mutable, so you can modify it from any scope. That's why I decided 
>>>>> to
>>>>> go with plain variables, because they already have a limited scope in
>>>>> Elixir and clear rules (but at the same time I agree that adding :let
>>>>> would make those clear rules precisely more confusing!).
>>>>> 
>>>>> 
>>>>> 
>>>>> On Fri, Dec 17, 2021 at 7:01 AM Christopher Keele < christ... @ gmail. com
>>>>> > wrote:
>>>>> 
>>>>> 
>>>>>> I love the thought put into this proposal, and really like the problem it
>>>>>> is tackling! I am looking forward to the next proposal and will try to 
>>>>>> get
>>>>>> to my inbox earlier for it.
>>>>>> 
>>>>>> 
>>>>>> *Proposal Feedback*
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> I mostly second the impressions voiced here, but *really* want to call
>>>>>> attention to the criticism:
>>>>>> 
>>>>>> 
>>>>>> > this breaks refactoring for the inner contents of `for`
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> This is the real true deal-breaker for me. Referential transparency is a
>>>>>> huge part of my mental model of Elixir and the key reason why it is such 
>>>>>> a
>>>>>> joy to maintain code in. I am not sure if it is possible to introduce an
>>>>>> imperative-loop construct that *doesn't* violate this property, so I may
>>>>>> have to get over that. I do remember how painful it was to remove
>>>>>> assignment-inside-ifs, though.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> *Replies*
>>>>>> 
>>>>>> *
>>>>>> *
>>>>>> *Re:* for section <- sections, $section_counter = 1 , $lesson_counter = 
>>>>>> 1 do
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> > Maybe a possibility could be to distinguish comprehension variables, 
>>>>>> > for
>>>>>> example by prefixing them in the same way as module attributes are
>>>>>> prefixed with `@`.
>>>>>> 
>>>>>> *
>>>>>> *
>>>>>> This does elegantly solve my refactoring concern; in that "imperative"
>>>>>> comprehension variables copied out of the comprehension could immediately
>>>>>> raise a syntax error, as would moving them into a different comprehension
>>>>>> that does not have them declared as imperative in the comprehension head.
>>>>>> The compiler would also have to enforce never letting you use the same
>>>>>> name with an imperative variables as with a normal one, to completely
>>>>>> eliminate edge cases. I think this solution even works for nested
>>>>>> comprehensions, though I still am not sure how *that* would work with the
>>>>>> existing proposal.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> > We could maybe even remove the `let` keyword altogether?
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> That makes me really like syntax. We are not exactly running short on
>>>>>> propositions but it nice to keep that overhead low. Also, the only other
>>>>>> existing identifier syntax (module attributes) use a prefix/sigil 
>>>>>> approach
>>>>>> as well, and this feels in the same category to me: we are introducing a
>>>>>> different type of identifier with different scoping rules (even though
>>>>>> what happens at compile time to it is wildly different).
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> *Re:* overloading the <- operator
>>>>>> 
>>>>>> *
>>>>>> *
>>>>>> > My concern about this is that `<-` in for means extracting something
>>>>>> from the collection, so giving it another meaning inside an option can be
>>>>>> quite confusing.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> > If I'm not mistaken it actually means pulling the next item from an
>>>>>> enumerable.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> FWIW I've been writing Elixir for years and I still forget when I crack
>>>>>> open a for or for a with that I need to be using *<-*. I've just
>>>>>> internalized it as the "powerful SpecialForms clause operator". So I 
>>>>>> don't
>>>>>> think allowing its use in other powerful new constructs, potentially
>>>>>> nested in *for* or *with* , or inside their options lists, would be
>>>>>> confusing, from my perspective at least.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> --
>>>>>> 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/ 
>>>>>> 72ee4929-efde-476e-9124-bacd7460c486n%40googlegroups.
>>>>>> com (
>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/72ee4929-efde-476e-9124-bacd7460c486n%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/ 
>>>>> CAGnRm4%2BsbvBxoj1mECXzBna%3DJE-R8%2Bj-CBuRZvgAf%2BsLp2aMjw%40mail.
>>>>> gmail. com (
>>>>> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4%2BsbvBxoj1mECXzBna%3DJE-R8%2Bj-CBuRZvgAf%2BsLp2aMjw%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+unsubscribe@ googlegroups. com (
>> elixir-lang-core+unsubscr...@googlegroups.com ).
>> To view this discussion on the web visit https:/ / groups. google. com/ d/
>> msgid/ elixir-lang-core/ 
>> 10d18915-55da-4b52-8e12-0992625039e3n%40googlegroups.
>> com (
>> https://groups.google.com/d/msgid/elixir-lang-core/10d18915-55da-4b52-8e12-0992625039e3n%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/kxap51gd.a89f3bd3-f6d5-4440-bdcf-74f6c3fb1a52%40we.are.superhuman.com.

Reply via email to