*> 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
>>
>>
>> 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/10d18915-55da-4b52-8e12-0992625039e3n%40googlegroups.com.

Reply via email to