*> 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
>
>
> 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+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/2903649f-f012-494e-8973-b90d92131713n%40googlegroups.com.

Reply via email to