-
Notifications
You must be signed in to change notification settings - Fork 75
Usage statistics on optional chaining in CoffeeScript #17
Comments
One thing to keep in mind when interpreting these numbers is that "number of usages" probably isn't the best way to evaluate how important/useful a feature is, it's just the easiest thing to measure. Still, I think it's a rough proxy for usefulness. Ideally, you should also weight by how much of an improvement the syntax is over the alternative. Simple cases like |
@alangpierce Thanks for the analysis.
I wonder what are examples of such usages? |
@claudepache here's a gist with all 37 examples: https://gist.github.com/alangpierce/34b7aa40cda51b0a089a44680bdfed7e |
Thanks. That provides arguments for including optional assignment: #18 |
This analysis is awesome! |
@alangpierce Thanks so much for this detailed analysis! It's definitely appreciated. |
@gisenberg asked if I could get numbers on how often out-of-scope globals are accessed in soak operations. (In CoffeeScript,
Here's a gist with all 74 examples, all of which look intentional to me: See also tc39/proposal-nullish-coalescing#13 for some more discussion about that behavior. Note that the total amount of CoffeeScript in those repos has gone down by about 5% since my original post. I updated the README in the repo with new numbers, but the scale is pretty much the same for all of them. |
I found CoffeeScript's |
Actually, it looks like one of the usages I linked is unintentional, the use of https://github.com/atom/bookmarks/blob/master/lib/main.coffee#L38 There's a That sort of mistake is probably the main argument against the "evaluate to |
In most codebases, I would imagine so, but it's worth noting that this is actually very common if you are using Relay, where any part of the query could be |
@0x24a537r9 That's an interesting case. Do you have any data to share about your effort to use |
@littledan When using GraphQL, for example, the data you need can be deeply nested. At any moment, any field might be null. |
I think we're all in agreement that optional chaining should support these deeply nested use cases well. |
Make tc39#17 a link
Hi! I've been following a lot of the discussions here, and to help inform these discussions, I wrote a tool that gets statistics of how the
?.
operator is used in practice in real-world CoffeeScript projects. CoffeeScript includes basically all of the features under discussion (short circuiting, soaked new, soaked delete, soaked assignments, parens to block short-circuiting), so I think it's a good case study to see how these details play out in the real world.(For a little more background about me, I've been the main person working on the decaffeinate project for quite a while now, and I implemented
?.
and similar operations in decaffeinate, so I've worked with the nitty-gritty details of these operators quite a bit. My personal preference for JS optional chaining is to keep things simple; I was unpleasantly surprised when I learned how magical?.
is in CoffeeScript. But I'm a little biased because I've generally viewed this stuff from an implementer's perspective.)Here's the repo: https://github.com/alangpierce/coffeescript-soak-stats
The README has a detailed explanation of the different stats when run on about 500,000 lines of "typical" code found on GitHub (Atom, ShareLaTeX, CodeCombat, SwitchyOmega, Trix, Vimium, YakYak, and Bacon.js). Here are the results:
Some observations:
new
was never used and soakeddelete
was only used once.(a?.b).c
, it never came up in practice (probably because it would just make the code crash).a?.b = c
) had some usages, although of course they were much more rare than other uses of?.
.a?.b()
, that would cover 93% of all use cases.a?.b?.c
(which don't rely on short-circuiting) thana?.b.c
(which rely on short-circuiting).So I think this is at least an argument for leaving out
new
,delete
, and meaningful parens, unless they somehow makes things simpler.Happy to dig into the specific examples for these or run other statistics if people want. And of course it's open source and published on npm, so feel free to hack on it or try it on your own CoffeeScript code. I was reasonably careful and there are tests, but it's still possible some of these numbers are buggy.
The text was updated successfully, but these errors were encountered: