I don't think this feature is worth all this discussion or time, which is why I 
haven't said very much. But I don't like the idea.

It *is* ambiguous, in the sense that if you wrote the grammar in the natural 
way it would be an ambiguous grammar, so you have to rewrite the grammar in 
such a way as to force precedence rules to disambiguate.

But more importantly, I don't believe it's an important enough case to be worth 
syntactic support for, especially since `undefined' isn't always the default 
value you want to use.

And FWIW: Racket actually moved *away* from supporting one-armed `if' -- they 
disabled it somewhere around v4, I think -- because experience showed that the 
cases where it was useful were outnumbered by the cases where it caused 
accidental leakage of `undefined' values, which is the moral equivalent of a 
NullPointerException.

Dave

> Firstly, that code has no *real* ambiguity, because operator precedence tells 
> us how those implied () sets disambiguate it.
> 
> Secondly, in my opinion, the visual "ambiguity" of it is not made any more 
> burdensome (and is even perhaps SLIGHTLY *clearer*) by adding () sets to 
> disambiguate where you want optional `:`, such as this example (same as 
> above, but where `g` and `j` are omitted as placeholders for implied 
> `undefined`):
> 
> a ? b ? c : d ? (e ? f) : (h ? i) : k
> ==>
> a ? (b ? c : (d ? (e ? f : undefined) : (h ? i : undefined))) : k
> 
> Moreover, this code wouldn't have any actual ambiguity even if you omitted 
> those two sets of () in the original. It would still be a valid expression, 
> with a different (but still unambiguous) interpretation:
> 
> a ? b ? c : d ? e ? f : h ? i : k
> ==>
> a ? (b ? c : (d ? (e ? f : (h ? i : k)) : undefined)) : undefined
> 
> Developers who chain/nest ?: together are already familiar with how and when 
> they have to use () to disambiguate, and the rules for what happens when they 
> don't, and it seems like exactly the same effort for them to do so if implied 
> `: undefined` were something they wanted to/could leverage.
> 
> 
>> In sum, this sounds like an argument against ? as infix operator (implied : 
>> undefined).
> 
> I'm sorry, I'm lost by this statement. I don't understand on what basis you 
> conclude that I just argued against the very thing I'm asking for. Can you 
> elaborate at all?
> 
> 
> 
>>> var opts = {
>>> doX: (someX > 0 && someX < 10) ? someX ,   // leaving off the `: undefined` 
>>> (or `: null` if you prefer)
>>> doY: (someY > 0 && someY < 1) ? someY   // ditto
>>> };
>> 
>> Sorry, I think this is a hazardous pattern. "doX" suggests a boolean value,
> 
> How is
> 
> doX = (someX > 0 && someX < 10) ? someX
> 
> more suggestive of a "boolean" value than is
> 
> doX = (someX > 0 && someX < 10) ? someX : undefined
> 
> Or, put another way, how are either of them suggestive of a boolean value 
> result? Unless you mean simply the name "doX" being suggestive of "do" or "do 
> not" (probably a poor name choice for my example), I don't see how either 
> code snippet itself implies a boolean value result.
> 
> As far as I am concerned, they both clearly indicate selecting a value (type 
> irrelevant) based on a boolean test. The implied part hides one of the 
> variable choices, yes, but I don't see how that suggests an entirely 
> different type of operation/result?
> 
> 
>> but you want (number | undefined), a type union.
> 
> I'm not sure if you're arguing against:
> a) the pattern of having an `undefined` value in a variable when "unset", 
> that otherwise stores numbers when it's "set"; OR
> b) the implied `: undefined`
> 
> If (a), this was a long held pattern long before I ever wrote my first line 
> of JavaScript. Moreover, it's far more common today on the greater web than 
> any code I've ever written. I'd argue it's pretty close to a de facto pattern 
> at this point, so I'm not sure what the point is in using that argument to 
> contradict my request for an implied `: undefined`. Moreover, this code 
> sample I gave is only one such example. If it irks you that much, I'm sure I 
> could find other examples to illustrate. But, I'm not really sure how that 
> helps or hinders the process.
> 
> If (b), I'm not sure what the type union for "set" vs. "unset" has to do with 
> the request for implied `: undefined`? These seem like different discussions 
> altogether.
> 
> It sounds like you're basically saying either that my idea is very niche and 
> thus irrelevant to consider, or that the supporting reasoning behind the idea 
> is flawed/bad code, and thus the idea is necessarily flawed/bad. Is it 
> either, both, or neither of those that you are suggesting?
> 
> 
>> If any consumer fails to discriminate using typeof, they'll get undefined 
>> which coerces to NaN as number (to 0 as integer). Bad times.
> 
> First of all, I'm talking about code where I am the consumer, so I take care 
> to make sure the proper checks are done.
> 
> Secondly, criticizing the pattern as a substitute for criticizing the 
> idea/proposal is a non sequitur, or orthogonal at best. Completely ignoring 
> the implied `: undefined` for a moment, there's plenty of other ways that a 
> variable might end up with a proper (numeric) value in the "set" state, and 
> an `undefined` value in the "unset" state. It is therefore a granted that, 
> regardless of whether implied `: undefined` were ever to be considered valid 
> or not, safely checking variables with proper understanding of type coercion 
> is a must.
> 
> 
> --Kyle
> 
> 
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to