::faceplam:: On Mon, Jul 9, 2012 at 12:36 PM, Andreas Rossberg <[email protected]>wrote:
> I agree with almost everything you said. But just to clarify, I think you > actually meant "refutable" everywhere you said "irrefutable". > > /Andreas > > > On 9 July 2012 18:19, Russell Leggett <[email protected]> wrote: > >> >> >> On Fri, Jul 6, 2012 at 1:37 PM, Brendan Eich <[email protected]> wrote: >> >>> Andreas Rossberg wrote: >>> >>>> >>>> We should talk more at this month's TC39 meeting, but I see a >>>> sharp divide ahead: >>>> >>>> 1. Choose (A), possibly with modification, either rejecting useful >>>> pattern matching decisively, or else making its pattern language >>>> differ by making prefix-! implicit. But you rejected splitting >>>> pattern meaning across destructuring and future pattern-matching, >>>> in the last sentence cited above. >>>> >>>> XOR >>>> >>>> 2. Choose (B) because future-proofing for pattern matching wants >>>> prefix-?, and impose a compatibility break from what we and others >>>> implemented, and what most JS users might expect based on JS's >>>> carefree imputing of undefined. >>>> >>>> >>>> Agreed. >>>> >>>> >>>> Comments from es-discuss peanut gallery welcome. >>>> >>>> I could go for 1/A, except for two facts. First, I believe there >>>> is a non-trivial body of Firefox JS that depends on imputing >>>> undefined. Second, and what is more important: we haven't >>>> usability-tested 2/B at all. >>>> >>>> >>>> Did you mean "could go for 2/B" there? >>>> >>>> >>> Evidently! >>> >>> I rearranged and renumbered but missed this one. Clearly I meant 2/B. >>> I'm a bit unhappy about making such a change so long after implementing 1/A >>> (without prefix-!). But never mind me -- what do others think? >> >> >> I would love to see 2/B. A lot of that is likely because I would love to >> see pattern matching, though, I'll admit. I think that the ? on refutable >> portions of the pattern would work well with the new default and >> existential operators, while I think ! will not have a good analog. If I >> were to throw out another reason based on destructuring assignment alone, >> and not pattern matching later, I would say that if parts of the >> destructuring are likely to fail, it would be better to know upfront. If >> there are optional fields, ? clearly expresses that. If there are wildly >> unknown structures, destructured assignment is probably not the best >> approach, or at least there should be some structural testing upfront >> (pattern matching would of course be ideal). >> >> As for usability testing, while it obviously is not done irrefutably in >> spidermonkey now, I think we can at least look to other languages. Looking >> over several languages, all of the ones I have seen are irrefutable. Some >> are strongly typed languages, but not all. Python does not have complete >> patterns, it can basically just destructure list, but even it requires that >> the number of elements be correct. Erlang, OCaml, and F# all allow full >> pattern assignments, and they will all throw errors if not correctly >> matched. Obviously, it is a little different than what it would be in ES, >> they have full on patterns not just destructuring, but it would clearly be >> all the more consistent when patterns *hopefully* get added. I know that JS >> users have come to expect a certain amount of carefree imputing, but >> destructuring is new (outside of FF), and I think it is certainly an area >> which has options. I haven't exactly done a formal survey of languages, but >> from what I've seen JS would be the first to be so lenient. Allowing ? in >> portions of a pattern, I actually think would be the perfect compromise. >> People who write very loose code will either have to put ?s on their >> patterns or keep working the same way they have been, but if there isn't a >> reasonable amount of checking by default, I think we're going to be seeing >> some more WATs in presentations. JS gets picked on for how much coercion >> and silent errors it will chug along with. Best practices of always using >> === and avoiding 'with' are just a couple of examples. >> >> Finally, I would like to take the approach of looking at the best way to >> handle the different use cases. >> >> 1. Really simple destructuring with expected results: >> let {x,y} = getPoint(); >> In my opinion, this should throw if x or y are not available. It is >> unlikely that the coder is checking properties here, they are just going >> to >> call other functions passing through x or y. It would probably be better >> to >> get the error as soon as possible. Much easier to debug that way. In many >> cases, I think these types of destructuring assignments will lead to >> effortless checking that would previously have been missed because of the >> extra effort to add those checks in as if statements. >> 2. Options type objects: >> let {url,callback,?errback} = options; >> This lets you very clearly decompose an object and declaratively show >> which values are optional and which ones are not. If all of them are >> optional, the ? would just go to the left of the brace, but really this >> should be the minority case for most situations. >> 3. A disparate list of possible types of matches. This is common in >> "overloaded" functions where the number and type of arguments can be >> wildly >> different. This is probably the strongest case against irrefutable >> matching, because it is so likely to result in mismatches which should >> have >> logic performed on them instead of having an error thrown. However, it is >> also the strongest case for pattern matching. There is nothing wrong with >> wanting to accept differently shaped things, but right now there is not >> really a great facility for acting on them. Pattern matching would be >> ideal. I think it would be such a powerful addition to the language as it >> is used right now, that it honestly pains me that we would cut out the >> possibility. I would love to see patterns now, but I can understand >> waiting. Making a decision which would close it off though would be >> extremely disappointing. >> >> I know that full blown patterns are out of scope (though I'm hoping maybe >> this discussion might change that), but even if we can't have it now, I >> think irrefutable destructuring would really make people see the potential. >> Even if no facility was provided for it, a hypothetical match function >> could be created which would take function and execute them in sequence in >> a try catch until one did not fail. I think we can do better than that and >> should probably try if we go with irrefutable destructuring, but just >> knowing it would be possible for the community to take and run with is nice. >> >> - Russ >> >> >>> >>> >>> /be >>> >>> ______________________________**_________________ >>> es-discuss mailing list >>> [email protected] >>> https://mail.mozilla.org/**listinfo/es-discuss<https://mail.mozilla.org/listinfo/es-discuss> >>> >> >> >
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

