> On Jan 2, 2013, at 7:58 PM, Brendan Eich wrote:
>
>> I think we can do this now. Allen should weigh in. Hope to hear from Andreas 
>> R. soon too!
>>
>> Apologies for the long thread, and thanks to Herby for interaction that 
>> clarified many things. Perhaps I should resummarize:
>>
>> The best new-new plan to avoid adding slop is to revise ES6 destructuring 
>> thus:
>>
>> 1. No ToObject(RHS).
>> 2. Exception on missing property selected without a ?-suffix.
>> 3. ?-suffix allowed on any pattern, imputing undefined deeply instead of 
>> refuting.
>> 4: the ? is a separate lexeme from the : in long-hand patterns.
>>
>> How's that?

[Sorry to be late, catching up from a 2 weeks off-line vacation. :) ]

Thanks Brendan for reviving the discussion. That plan mostly matches
what I was arguing for last time round (including the necessity to
allow ? on every pattern), so me likes. I still see some issues with
making ? postfix (readability, parsing), but that's a comparably minor
point.


On 4 January 2013 01:33, Allen Wirfs-Brock <al...@wirfs-brock.com> wrote:
> I'm fine with points 2-4.  However, I think no ToObject(RHS) would be a 
> mistake.  Here's why:
>
> In almost all other situations where an object is needed, a primitive value 
> (including a literal) can be used.  This includes contexts that use the dot 
> and [ ] property access operators. Essentially, in all object appropriate 
> situations primitive values act as if they were objects. This is important in 
> that in most cases it allows ES programmers to ignore distinctions between 
> objects and primitive values.
>
> Destructuring is frequently described as simply a de-sugaring over property 
> access in assignments and declarations.
>
> let {length: len} = obj;
>
> is most easily explained by saying that it is equivalent to:
>
> let len = obj.length;
>
> But if the ToObject is eliminated from the RHS then this desugaring 
> equivalence is no longer valid in all cases.  The obj.length form would work 
> fine if the value of obj was a string but the destructuring form will throw.  
> This breaks the general ES rule that you can use a primitive value in any 
> context where an object is required.  It is the sort of contextual special 
> case that developers hate and which makes a language harder to learn. 
> Consistency is important.
>
> Finally, note that now with exceptions on missing properties (without ?) it 
> is likely that most situations where a primitive value is erroneously used on 
> the RHS will throw anyway simply because the primitive wrapper probably won't 
> have the requested property. So, removing the ToObject just creates 
> inconsistency without adding much in the way of error detection.

All good points, and I think it makes sense to separate the discussion
of implicit conversion from refutability itself.

I think your argument presupposes an assumption that only happens to
hold for the pattern language currently proposed, but is unlikely to
remain so in the future: namely, that all patterns describe objects.
In particular, a pattern matching construct wants to allow, say,
strings, null, true and others as patterns, and surely you do _not_
want ToObject in those cases.

One defensible position might be to only invoke ToObject when actually
matching against an object/array pattern. But to be consistent, you'd
then have to do similar conversions for other patterns, too, e.g.
invoking ToString when matching against a string. Unfortunately, that
would make using a future pattern matching construct correctly much
harder and more tedious. For example, writing

  match (e) {
    case true: ...
    case null: ...
    case {x, y}: ...
  }

will take the first case for all objects, although that is unlikely to
be the intention, here or elsewhere. Similarly,

  match (e) {
    case {}: ...
    case
  }

runs into the first case for almost anything when the more natural
expectation may be only actual objects.

So I believe that in the context of patterns, implicit conversions
violate the principle of least surprise and are future-hostile (in
terms of usability) towards a more general pattern matching facility.

/Andreas
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to