00:04 | <leobalter> | ystartsev akirose robpalme bterlson +{other chairs?] we should nominate André Bargull for the Ecma Fellow Award. |
00:07 | <leobalter> | This is optimistic and not a joke. I could stress some reasons why, but I'm pretty solid about my statement. |
00:28 | <akirose> | wanna put those reasons in an email to us? |
00:44 | <leobalter> | I'll try to write down some stuff. It should be around anba's extensive contributions to ECMA-262, ECMA-402, Test262 all in a personal capacity, probably unfunded for most of the work, if not 100% of it. |
01:03 | <Bakkot> | anba has the distinction of being the second-largest contributor to ecma-262 by number of commits |
03:14 | <ljharb> | candidate for ES2021 is released: https://github.com/tc39/Reflector/issues/361 |
03:23 | <devsnek> | ljharb: should it be on the agenda |
03:23 | <ljharb> | it is, part of the 262 update |
03:23 | <devsnek> | ah ok |
03:24 | <devsnek> | is this the thing where we go through the member list |
03:24 | <ljharb> | yeah |
03:25 | <devsnek> | exciting |
03:35 | <leobalter> | Bakkot: anba is the top contributor of ECMA-402 by number of commits. 5th in Test262, but that's just a rough idea. The contributions are pretty good in quality too. |
08:56 | <ystartsev> | leobalter: happy to add it to my slides -- did you send me an email (might have missed it) |
09:25 | <ystartsev> | Bakkot: leobalter added it: https://docs.google.com/presentation/d/1uwBpXKUaZPor14taHnguP29ur6q1gmshho6IHcGbF8w/edit#slide=id.gc5fb7997ab_0_0 |
09:27 | <leobalter> | Thanks ystartsev! I’m sending an email in the morning. I had some extra work today until late night so I got late on this. |
09:27 | <ystartsev> | no prob |
09:27 | <ystartsev> | i can also give you edit access to the slides? might be faster |
14:48 | <robpalme> | hello all, for today's plenary we are going to use Jitsi video conferencing for the first time. as usual, the link is given to you via the sign-in form. |
14:48 | <robpalme> | More details are on the Reflector meeting link: https://github.com/tc39/Reflector/issues/348 |
14:49 | <robpalme> | I encourage joining early to try out Jitsi features. We will start the Jitsi one hour before the real meeting for anyone wanting to do tech checks. |
16:10 | <robpalme> | the draft schedule is now posted on the reflector |
16:11 | <ryzokuken> | ty |
17:14 | <robpalme> | the Jitsi meeting is now started for anyone wishing to do a tech check |
17:20 | <brad4d> | I cannot login to Jitsi - it's asking me for a key |
17:21 | <brad4d> | (maybe password? my display is in Spanish for some reason) |
17:21 | <robpalme> | try using the password provided in the sign-in form |
17:21 | <brad4d> | "Clave necessario" |
17:21 | <brad4d> | right- duh |
17:41 | <leobalter> | ystartsev: I did an edit at the slides (André's slide only). I'm not sure if we should include that giving a fellow award to André is valuable for us to make sure the volunteer work is never blocked by them not being part of a member org. 6+ years of contributions is pretty fair for this. |
17:48 | <rkirsling> | wait, this app yells at you if you're not using Chrome? |
17:48 | <rkirsling> | that's pretty unfortunate |
17:52 | <rkirsling> | gonna try to use safari anyway and see what happens |
17:57 | <rickbutton> | what is missing from firefox/safari that makes video apps prefer chrome? |
17:57 | <rickbutton> | I hate having a single chrome tab for google meet and others |
17:58 | <ljharb> | rkirsling: safari doesn't work on it at app |
17:58 | <ljharb> | *all |
17:58 | <ljharb> | rkirsling: the audio is trash |
17:58 | <ljharb> | rkirsling: mobile safari too |
18:01 | <rkirsling> | audio seems okay |
18:01 | <rkirsling> | rickbutton: google meet works okay in safari 👍 |
18:01 | <michaelficarra> | this software seems nice so far |
18:02 | <ljharb> | rkirsling: hm, i ended up having to use the native app for it to work at all |
18:02 | <ljharb> | (on ipad) |
18:02 | <michaelficarra> | there was an info window that said something about requiring insertable streams |
18:02 | <michaelficarra> | I don't even know what those are |
18:05 | <rkirsling> | are there meant to be slides? |
18:05 | <rbuckton> | Minor complaint about jitsi, its hard to tell which audio device is which in settings: https://usercontent.irccloud-cdn.com/file/etG782LQ/image.png |
18:05 | <ryzokuken> | rkirsling: yelling for not using Chromium is an Igalia instance-specific thing 😅 |
18:05 | <ljharb> | that is a lot of audio devices |
18:05 | <rbuckton> | There's an ellipsis, but no way to expand. |
18:05 | <rkirsling> | (no worries if not I'm just making sure I'm not missing functionality) |
18:05 | <ryzokuken> | because we used to have issues with old firefox versions |
18:06 | <rbuckton> | I blame voicemeeter for the length of the list, but jitsi for the width of the list :) |
18:06 | <rkirsling> | ryzokuken: ah okay 😅 |
18:06 | <ljharb> | kind of weird that it doesn't highlight/prioritize the view of whoever's speaking |
18:07 | <ljharb> | (on the tile view) |
18:07 | <rbuckton> | ljharb: turn off tile view? but I see what you mean |
18:08 | <wsdferdksl> | Is there a way to get it to not cover up parts of the view with controls? |
18:08 | <michaelficarra> | wsdferdksl: toggle to the grid view? |
18:09 | <leobalter> | jitsi is beach balling |
18:09 | <rbuckton> | If you're not in tile view, you can hide the participant list in the bottom right corner: https://usercontent.irccloud-cdn.com/file/Ta9MuFJA/image.png |
18:09 | <leobalter> | I'm losing most of the audio |
18:10 | <shu> | oh whoa sam is on the call |
18:10 | <robpalme> | which client are you using leo? the audio is fine for me |
18:10 | <ryzokuken> | same on the electron client |
18:10 | <ljharb> | even in non-tile view tho the "big" person isn't always the speaker, is there a way to do that? |
18:11 | <shu> | wait are we supposed to be seeing slides |
18:11 | <ryzokuken> | no |
18:11 | <shu> | ok |
18:11 | <ryzokuken> | oh |
18:11 | <Bakkot> | ystartsev: killed the bot on the assumption we aren't trying to transcribe this |
18:11 | <ryzokuken> | I see them now? |
18:11 | <robpalme> | i am presenting |
18:12 | <leobalter> | robpalme: Web version on Safari, it recommends to use Chrome or Chromium as the only fully supported alternative |
18:12 | <leobalter> | it's going ok on Chrome |
18:12 | <rkirsling> | ooh those TCQ reactions got deployed |
18:12 | <ryzokuken> | leobalter: Safari has a few issues unfortunately :/ |
18:13 | <rkirsling> | hmm yeah slides remained a black box |
18:13 | <leobalter> | I understand, but it should be better to make that information available with the video link, before I join |
18:15 | <rkirsling> | FF displays slides |
18:16 | <robpalme> | leo, I will update the link to say Safari has known issues |
18:16 | <leobalter> | Thanks! |
18:16 | <ryzokuken> | robpalme: could you also recommend the electron app? That should work for most people and all platforms |
18:17 | <ryzokuken> | https://github.com/jitsi/jitsi-meet-electron |
18:17 | <rbuckton> | another jtsi "issue"? It uses `Shift+S` for fullscreen, but I use `Win+Shift+S` to take screenshots on Windows (like the two I posed above), which causes it to swap between fullscreen and windowed :(. |
18:17 | <leobalter> | ryzokuken: where is the electron app? the Downloads page only points to App Store, google play, etc |
18:18 | <ryzokuken> | I never knew the Shift+S shortcut before today! :D |
18:18 | <ryzokuken> | leobalter: https://github.com/jitsi/jitsi-meet-electron |
18:19 | <ryzokuken> | https://github.com/jitsi/jitsi-meet-electron/releases/tag/v2.6.1 was released 4 days ago, should work just fine. |
18:21 | <rkirsling> | oh the tcq reactions disappeared just as I was gonna try using 'em |
18:25 | <msaboff> | Whenever I connect, it disconnects within a minute and tries connecting again. |
18:26 | <robpalme> | Michael, which client are you using? |
18:26 | <msaboff> | Safari |
18:26 | <robpalme> | Jitsi does not seem to work in Safari. |
18:27 | <robpalme> | On iOS the native app works well |
18:27 | <rkirsling> | seems like everybody who's tried it has had a *different* issue but yes, latest FF is more stable |
18:27 | <msaboff> | I shouldn't have to download something to attend the meeting. |
18:28 | <msaboff> | What is wrong with what we used (Teams) for the last several meetings? |
18:28 | <robpalme> | yes, it's unfortunate it doesn't work in Safari |
18:29 | <ljharb> | msaboff: soooooo many things |
18:29 | <robpalme> | we had reports from multiple people of issues with Teams. |
18:29 | <msaboff> | So we are having an open standards meeting with a platform that doesn't work with more than one browser? |
18:29 | <haxjs> | It seems it works fine in Edge :) |
18:30 | <robpalme> | It works in Firefox |
18:30 | <msaboff> | Why should I have to download another browser to attend? |
18:33 | <robpalme> | there are also desktop clients available https://desktop.jitsi.org/Main/Download |
18:35 | <rbuckton> | littledan: Different regexp engines handle duplicate capture groups in different ways. May need to investigate options... |
18:37 | <littledan> | rbuckton: Oh, that's interesting, do you know if there's a summary anywhere? |
18:37 | <littledan> | I guess jitsi sort of works with Safari, just not with very good performance on video, right? |
18:38 | <rbuckton> | littledan: I'm working on a comprehensive comparison of regexp engines, but haven't written anything up about that yet |
18:38 | <haxjs> | It seems jitsi should work on safari but just have some bugs... |
18:39 | <ryzokuken> | littledan: Jordan had many issues trying to make it work on Safari too :( |
18:39 | <littledan> | :( |
18:39 | <ljharb> | littledan: when i tried it yesterday, on desktop the audio was jittery and unhearable, and on mobile it was silent |
18:39 | <littledan> | oh, I thought that was due to video, I misunderstood |
18:39 | <ljharb> | the video quality was worse, yes, but otherwise usable |
18:39 | <rkirsling> | audio was fine for me but slides wouldn't appear |
18:39 | <littledan> | that's too bad |
18:40 | <littledan> | Safari users, is there a video conferencing system that you'd recommend better? |
18:40 | <littledan> | (WebEx?) |
18:40 | <littledan> | maybe we could work together on fixing Jitsi--it's an open-source project... |
18:41 | <ryzokuken> | yeah, they just have very little number of contributors running Safari |
18:42 | <ryzokuken> | ideally, even filing in issues would be enough I think :D |
18:42 | <littledan> | wow, we are doing awesome on time! |
18:43 | <rickbutton> | we should file a bug report for that slide problem |
18:43 | <littledan> | consensus on seeing slides |
18:44 | <rickbutton> | +1 for seeing slides for stage 1 |
18:44 | <ryzokuken> | :P thanks we'd ask for Stage 2 next meeting then |
18:50 | <wsdferdksl> | too many issues with jitsi |
18:53 | <rbuckton> | I have two monitors, and even with jitsi fullscreen on one monitor, I keep getting a PIP window of the same slides in my other monitor :/ |
18:53 | <ryzokuken> | wsdferdksl: the one specific issue with visual clutter that you mentioned is something that I've felt too, and it also frustrates us when we try to record presentations over Jitsi. |
18:54 | <ryzokuken> | so I'll try to come up with a custom CSS hack that can toggle the controls for now |
18:54 | <ryzokuken> | and ask for that feature on the issue tracker to be built into the client. |
18:55 | <ryzokuken> | for the time-being, I usually just right click to open the inspector and turn off the elements manually. |
19:02 | <michaelficarra> | I am open to forgetting about species |
19:06 | <michaelficarra> | FYI there is a per-person volume bar in the top right corner of the person's tile |
19:06 | <leobalter> | If I could only find the person's tile |
19:07 | <michaelficarra> | hover over the hamburger to make it appear |
19:07 | <michaelficarra> | leobalter: it's the one surrounded in blue |
19:07 | <Bakkot> | this presentation ought to have mentioned that `reverse` and `reversed` is already how python spells these methods |
19:07 | <rickbutton> | ^ great point |
19:07 | <leobalter> | michaelficarra: I'm pretty sure it was not showing in my screen |
19:07 | <michaelficarra> | leobalter: it's a little subtle |
19:08 | <rkirsling> | Bakkot: +1 |
19:09 | <leobalter> | michaelficarra, DR tile is not here and that didn't happen while he was speaking either. https://usercontent.irccloud-cdn.com/file/tppB37vN/Screen%20Shot%202021-03-09%20at%2011.08.13%20AM.png |
19:09 | <michaelficarra> | leobalter: that pane scrolls |
19:10 | <leobalter> | thanks! that should solve the problem next time! |
19:10 | <ljharb> | i'm told igalia disabled the feature where it pins whoever's talking |
19:10 | <michaelficarra> | blame your OS for hiding scroll bars |
19:10 | <michaelficarra> | that's a terrible UI decision |
19:10 | <ljharb> | yuppppp |
19:10 | <leobalter> | yes |
19:10 | <ljharb> | first things i do on any mac is to unhide scrollbars and disable "natural" scrolling |
19:11 | <michaelficarra> | another example of making it pretty at the expense of usability from Apple |
19:12 | <haxjs> | Not sure I asked the correct question... What I asked is it seems `let deleted = a.slice(...); let newArray = a.spliced(...)` repeat some computation. Maybe `let [newArray, deletedItems] = a.spliced(...)` ? |
19:14 | <TabAtkins> | haxjs: Your question was correct, it was just misinterpreted. ^_^ I've seen both patterns, I think, in other languages with non-mutating methods, and I'm not sure which I prefer. :/ |
19:16 | <rickbutton> | oh I see your question now haxjs, please open an issue for spliced |
19:16 | <rickbutton> | worth discussion |
19:16 | <ljharb> | tbh i don't even know if "splice" has enough use cases to warrant "spliced" :-p |
19:16 | <ljharb> | almost every time i've come across splice in the last decade or two is because someone misspelled slice |
19:17 | <haxjs> | Will we have a separate repo for these new methods? so I can create issue for that? |
19:17 | <rickbutton> | I would create the issue on the Record/Tuple repo. Whatever it returns, it should return the same for both. |
19:17 | <ljharb> | jridgewell: IIFE boilerplate is a high cost. |
19:17 | <rickbutton> | ljharb: not wrong but consistency |
19:18 | <ljharb> | rickbutton: right |
19:18 | <haxjs> | @rickbutton thank u! |
19:18 | <rickbutton> | I have to look up splice on MDN every time I use it |
19:19 | <ljharb> | rickbutton: i _implemented_ it in es6-shim and i still can't figure out its api without a few tries |
19:19 | <rickbutton> | :) |
19:22 | <jridgewell> | Compared with the syntax, it's dozen restrictions, and having to learn completion values? |
19:22 | <jridgewell> | I don't think there's any point to this proposal if it's just sugar. |
19:22 | <Bakkot> | fwiw I care more about async do, and that one _is_ just sugar under any variant of this |
19:23 | <ljharb> | i don't think anyone has to learn most of the completion values; i think it's quite intuitive (and the weird cases should be banned or fixed) |
19:23 | <ljharb> | jridgewell: i hear that you don't find value in it. many of us do, tho. |
19:24 | <ljharb> | literally even being able to use `const` with an if/else-produced value would be more than sufficient benefit to me |
19:24 | <ljharb> | (obv there's many more benefits than that) |
19:26 | littledan | applauds |
19:28 | <littledan> | yeah, so I was specifically saying, I don't think it's important that study participants be able to answer the kind of question that Waldemar asks |
19:35 | <Bakkot> | jridgewell do you have similar feelings about async do? |
19:36 | <ljharb> | TabAtkins: did you get an answer to your multipage question in jitsi chat? i think it's "yes" |
19:36 | <TabAtkins> | I didn't, but thanks! |
19:36 | <leobalter> | https://usercontent.irccloud-cdn.com/file/yUvdt4SA/Screen%20Shot%202021-03-09%20at%2011.36.29%20AM.png |
19:37 | <jridgewell> | Bakkot: Yes, it's the same |
19:37 | <Bakkot> | jridgewell so async do fundamentally can't allow return or continue |
19:37 | <Bakkot> | since it's not executing at the same time |
19:37 | <littledan> | btw were there any technical problems before this one? |
19:37 | <Bakkot> | does that mean you're opposed to async do in general? |
19:37 | <rickbutton> | ron had to restart once littledan |
19:37 | <haxjs> | @jridgewell I feel if it's not just sugar it also could bring more problems than benefit ... :) |
19:37 | <msaboff> | littledan: Only accessing the meeting! |
19:38 | <littledan> | (we definitely had problems with Teams not supporting non-Chrome browsers in the past) |
19:38 | <rickbutton> | we should just switch back to zoom, the only consistently consistent experience |
19:38 | <littledan> | and also problems with screensharing being broken in Teams |
19:38 | <akirose> | "back to" have we ever used Zoom? |
19:39 | <akirose> | several companies don't allow Zoom on corporate laptops |
19:39 | <rickbutton> | we used zoom like once in the start of the pandemic |
19:39 | <ljharb> | +1 for zoom |
19:39 | <ljharb> | zoom has a webview |
19:39 | <rickbutton> | yep they try real hard to hide it |
19:39 | <ljharb> | my company wouldn't allow me to install any of the native chat apps, jitsi include it |
19:39 | <ljharb> | *included |
19:39 | <rbuckton> | I've been reporting feedback to the Teams dev team. |
19:39 | <Bakkot> | jridgewell btw the motivation for async do is basically this tweet: https://twitter.com/mcclure111/status/1336911574582386688 |
19:39 | <Bakkot> | (which expresses a sentiment I feel myself on an almost daily basis) |
19:39 | <rkirsling> | nice |
19:40 | <ljharb> | ^ IIFE boilerplate is an exceedingly high cost. |
19:40 | <haxjs> | So maybe IIFE sugar is just what people want... |
19:41 | <Bakkot> | other people also want the nice early-return-in-matching thing that do-exprs allow |
19:41 | <littledan> | Does Zoom work on Safari? It's not clear what problem this is solving. |
19:41 | <haxjs> | Note here if the main use case is replacing IIFE, we need to support local return, because many IIFE use early return (guard pattern). |
19:42 | <ljharb> | littledan: yes, zoom works fine on safari |
19:42 | <ljharb> | littledan: altho to be fair i don't spend much time in the web version |
19:59 | <rkirsling> | is it by his own choice that he never comes to plenary? |
20:00 | <ryzokuken> | rkirsling: they do not work for a member IIUC |
20:00 | <shu> | sorry what is the difference between Fellow and Recognition Award |
20:00 | <rkirsling> | oh I thought he was a mozillian |
20:00 | <ryzokuken> | shu: fellow is a lifetime achievement award |
20:00 | <ryzokuken> | and the latter is more commonly given out |
20:00 | <shu> | does one of them come with CHFs |
20:01 | <ryzokuken> | idk but probably just glass bricks |
20:01 | <ljharb> | shu: iirc a fellow can attend forever without being a member |
20:01 | <ryzokuken> | leobalter: thank you so much for nominating anba :D |
20:01 | <ljharb> | shu: ie, brendan and allen |
20:01 | <shu> | ljharb: oh interesting |
20:02 | <ljharb> | (i think they don't get a vote on votable things tho) |
20:02 | <leobalter> | they don't get a vote |
20:03 | <leobalter> | ryzokuken: I believe we can set a good example while we maintain ourselves as welcoming to André's contributions |
20:03 | <ryzokuken> | when did we last vote on something? |
20:03 | <ryzokuken> | leobalter: yes! I saw you suggesting them and was like "why did I never do this?" |
20:03 | <ryzokuken> | but yeah, their work is amazing |
20:04 | <rkirsling> | so did the tcq reactions get hidden then? |
20:04 | <shu> | i think it's a good point, though, that if one of the primary benefits of an Ecma fellow is to be able to come to the meetings, and he doesn't come |
20:04 | <shu> | i'd rather shower him with money |
20:04 | <rkirsling> | I saw them there for the first couple of presentations and then they disappeared |
20:06 | <ljharb> | msg littledan only andre is suggested as a fellow, i think |
20:06 | <ljharb> | lol forgot a / |
20:08 | <littledan> | oh, oops, I guess I would've known that if I clicked on the slides, I was just confused, sorry |
20:09 | <littledan> | Andre has certainly made outstanding contributions and I'd be happy to give him lots of honors |
20:09 | <rbuckton> | quick point: If we're serious about `yea`/`nay`, we should ask them as independent questions rather than a single question because its hard to differentiate between them when everyone talks at once. |
20:09 | <littledan> | tbh we set up the "Ecma Fellows" program at first because there was no invited expert system, and people at first wanted to have really high standards for this kind of thing |
20:22 | <ystartsev> | the yea/nay was a spur of the moment thing, we don't have to repeat it |
20:22 | <ystartsev> | i wanted to make sure people could say no |
20:22 | <ystartsev> | i hope it worked |
20:28 | <ystartsev> | (also was in the interest of time, really) |
20:36 | <ljharb> | littledan: you're not presenting, right, just practicing? |
20:36 | <littledan> | Right, sorry if it is distracting |
20:37 | <rkirsling> | I got worried too lol |
20:38 | <ljharb> | just panicked that i'm missing things |
20:39 | <rickbutton> | nope we are starting back up in 21 mins |
21:00 | <jridgewell> | To preemptively explain a question that will come up with this: "What's the difference between module fragments and module blocks" |
21:00 | <jridgewell> | The way I found useful to think about is that Fragments are like Function Declarations (must have identifier) and Blocks are like Function Expressions. |
21:00 | <jridgewell> | The Fragments have additional abilities the Blocks don't. |
21:02 | <ljharb> | hm, i don't hear anything |
21:02 | <ljharb> | rejoining |
21:03 | <jridgewell> | (and there's an error on that slide, it should say "can't close over countBlock or uppercaseBlock") |
21:03 | <ljharb> | k, rejoining fixed it |
21:04 | <shu> | really, a JS app has 100k modules? |
21:04 | <michaelficarra> | jridgewell: thanks, that makes more sense |
21:05 | <rickbutton> | shu: gmail? |
21:05 | <rickbutton> | or docs |
21:05 | <shu> | those aren't written in JS natiely |
21:05 | <shu> | natively* |
21:05 | <ljharb> | shu: airbnb had 30,000 react components when i left in july 2019, and many more modules than that |
21:06 | <rickbutton> | jesus |
21:06 | <shu> | ljharb: i see, thanks |
21:06 | <rickbutton> | facebook certainly has more still if thinking about React components |
21:06 | <rickbutton> | since most codebases do 1 component per moudle |
21:07 | <ljharb> | the last time i'd checked with both, airbnb had more components than facebook (altho possibly not more modules) |
21:07 | <ljharb> | (that was a number of years ago tho) |
21:14 | <drousso> | i wonder if maybe we could use `private module` and `public module` here 🤔 |
21:15 | <ljharb> | drousso: to be that's the same problem with using those terms on class fields; JS only has "reachable" and "unreachable" |
21:15 | <haxjs> | it seems `export module` could ensure it always in top-level. And all module not exported is just "private"? |
21:15 | <ljharb> | like any other variable, yes |
21:15 | <ljharb> | (i'd assume) |
21:16 | <drousso> | i suppose |
21:16 | <shu> | drousso: you mean `#module` and `module`? |
21:16 | <drousso> | shu not really? 😅 |
21:16 | <drousso> | shu it was an alternative to `export module` |
21:16 | <jridgewell> | I like the export/un-exported distinction |
21:16 | <drousso> | i guess also since we're already inside a module context then `export` is more understandable |
21:16 | <drousso> | yeah |
21:17 | <shu> | drousso: ah okay |
21:17 | <haxjs> | what happened on `export default module #foo` ? syntax error? |
21:19 | <jridgewell> | haxjs: Yes |
21:20 | <jridgewell> | The exports aren't a value, so that wouldn't result in anything that could be imported |
21:21 | <ljharb> | like anything that can't appear in expression position, i'd assume so |
21:21 | <haxjs> | so does it mean `module #foo {}` actually a special thing and can only in top-level? |
21:22 | <jridgewell> | Yes |
21:22 | <jridgewell> | It's a module-level declaration only |
21:23 | <ljharb> | like import and export |
21:23 | <robpalme> | dan is saying that splitting into separate modules has demonstrable perf issues |
21:24 | <robpalme> | that can be mitigated by combining them into fragments |
21:27 | <michaelficarra> | is the idea that you can declare any module specifier or only a fragment at the containing module's URL? |
21:28 | <robpalme> | only a fragment |
21:28 | <haxjs> | should only fragment |
21:28 | <michaelficarra> | interesting, how does that work with other ecosystems that use non-URL module specifiers? |
21:29 | <haxjs> | like node? |
21:29 | <robpalme> | so you are declaring a subdivision (a fragment) that can be externally referenced |
21:29 | <michaelficarra> | yeah a fragment isn't really a thing in the node module specifier namespace |
21:29 | <ljharb> | yes it is |
21:29 | <michaelficarra> | oh, it is? |
21:29 | <ljharb> | package.json files can have an "imports" field |
21:29 | <ljharb> | and those are like a package-local import map |
21:29 | <ljharb> | and those all have to start with `#` |
21:30 | <jridgewell> | AMP is affirmatively for this. |
21:30 | <ljharb> | michaelficarra: https://www.npmjs.com/package/has-package-imports is my detection package, which lists node versions and links to the docs |
21:30 | <haxjs> | a interesting thing is import x from './mod/lib.js#foo' maybe already work today ... not sure whether it will be any compat issue... |
21:31 | <keith_miller> | littledan: I'm happy to be a lowercase c co-champion haha |
21:31 | <keith_miller> | I have a lot of things on my plate though... |
21:31 | <keith_miller> | So, I may or may not have a ton of time. |
21:31 | <littledan> | yeah I think we can all bring different things to the table here so I'm happy to work with keith_miller and Mark as they're available |
21:31 | <littledan> | and any others--there's no limit here |
21:32 | <michaelficarra> | ljharb: this imports thing seems unrelated to what is proposed |
21:32 | <ljharb> | michaelficarra: right but in node you can currently `import 'package-name/#foo'` and it does a thing |
21:32 | <TabAtkins> | Re: normalization, yes yes *yes*, it's, I think, the largest reason we can't use native Maps in the DOM. |
21:32 | <ljharb> | michaelficarra: so if package-name's "main" had an exported module fragment, there's a conflict |
21:32 | <michaelficarra> | okay so you're saying it's actually related in its incompatibility with that system |
21:33 | <ljharb> | correct |
21:33 | <michaelficarra> | I thought you were saying it worked well with that system |
21:33 | <haxjs> | @littledan Jack may be also interested in module fragment but he is sleeping now, i will ask him tommorow :) |
21:33 | <ljharb> | michaelficarra: ah no, the reverse |
21:33 | <ljharb> | can the queue be advanced? |
21:33 | <ljharb> | akirose robpalme bterlson ^ |
21:34 | <ljharb> | ty |
21:34 | <akirose> | my b |
21:34 | <jridgewell> | ljharb: This seems like a really small edge-case |
21:34 | <jridgewell> | Same as in the browser. It technically already does something, but what it does is dumb, and I've never seen it used. |
21:34 | <ljharb> | jridgewell: i'm not sure how small it is, but i'm also not sure how its size makes a difference - it'd still have to be dealt with |
21:35 | <ljharb> | you've not seen it used because it's very new, and most tooling doesn't support it yet |
21:35 | <ljharb> | as for "is dumb", that's a subjective opinion i'm not sure how many will share |
21:35 | <ljharb> | wsdferdksl: can you confirm the last time we talked about this, that you'd be content with "Set can accept coerceKey or coerceValue, but not both"? |
21:36 | <haxjs> | jridgewell : "and I've never seen it used" --- not sure but someone may use it by import.meta.url ? (does import.meta.url keep fragment??) |
21:36 | <ljharb> | given that import maps can act on it, i'd hope so |
21:37 | <littledan> | haxjs: That's great to hear, I'm a big fan of Jack's work and I'd be happy to work with him on this effort |
21:40 | <jridgewell> | `import.meta.url` does include hash: https://candy-nutritious-cantaloupe.glitch.me/ |
21:41 | <haxjs> | I used searchparam via import.meta.url in some code but never test fragment, glad it also work :P |
21:46 | <TabAtkins> | keys and set values are both the things with uniqueness constraints. set values are not map values :/ |
21:46 | <jridgewell> | Param makes sense though, since it actually causes a fetch |
21:47 | <jridgewell> | Hash can't cause a fetch, but does create a new module instance, which is extremely surprising |
21:50 | <jridgewell> | Some's child is speaking? Is someone other than Jordan umuted? |
21:51 | <ljharb> | shu: what would it do for a Set if it returned `[1, 2]` - which one would it select |
21:51 | <ljharb> | or are you saying that the coercer could check `arguments.length` |
21:53 | <wsdferdksl> | ljharb: that would be ok |
21:53 | <haxjs> | What first mean here? |
21:53 | <ljharb> | wsdferdksl: thanks |
21:53 | <ljharb> | haxjs: `[0]` on the entry |
21:53 | <haxjs> | but it's an option bag? |
21:54 | <ljharb> | but i assume shu is suggesting `function coerce(...args) { if (args.length === 1) { /* set */ } else if (args.length === 2) { /* map */ } }` |
21:54 | <haxjs> | oh?? |
21:54 | <ljharb> | keith_miller: the same function could still return different results for both calls |
21:54 | <ljharb> | keith_miller: which would be nonsensical on a Set |
21:55 | <keith_miller> | ljharb: I just mean for Set if they are the same you would call the function once |
21:55 | <ljharb> | keith_miller: right, but then the coercer fn would have to know that's the case, where it might be expecting one call for key and one for value |
21:55 | <keith_miller> | well, I mean that's a bug I guess |
21:56 | <rickbutton> | could pass a "type" |
21:56 | <rickbutton> | although you have to name the type :/ |
21:56 | <ljharb> | yup |
21:56 | <keith_miller> | I dunno, that seems like an unusual use case |
21:56 | <rbuckton> | I thought shu was suggesting something like: |
21:56 | <rbuckton> | ``` |
21:56 | <rbuckton> | function coerce(entry, kind) { |
21:56 | <rbuckton> | if (kind==="key+value") { /* map, entry is [key, value] */ } |
21:56 | <rbuckton> | else { /* set */ |
21:56 | <rbuckton> | } |
21:56 | <rbuckton> | ``` |
21:56 | <rbuckton> | Seeing as how we use `key+value` for map iterators |
21:56 | <ljharb> | ah true, that would work too |
21:56 | <keith_miller> | ljharb: I would generally expect the coercer function to be pure |
21:56 | <ljharb> | keith_miller: as would i, but, javascript |
21:57 | <keith_miller> | haha yeah fair |
21:57 | <shu> | ljharb: if maps and sets are the only collections in your universe of collections, sure |
21:57 | <keith_miller> | Not sure we should design around all possible things JS programmers could do though |
21:57 | <shu> | the important thing was just: use positional parameters that match the positions to the set/add/whatever function that actually adds new entries to the collection |
21:57 | <shu> | and ignore names |
21:57 | <ljharb> | right |
21:58 | <shu> | so a 1-ary coercer could be used for Arrays and Sets |
21:58 | <shu> | but that kind of reuse is probably nonsensical |
21:59 | <keith_miller> | Yeah, IMO the return being an Array makes me :( |
21:59 | <shu> | to avoid the Array allocation issue, you can provide an array of coercers |
21:59 | <shu> | [coercer_for_param1, coercer_for_param2] |
21:59 | <keith_miller> | O.o |
21:59 | <shu> | that's no different than { coerceValue, coerceKey }, right? just not named |
22:00 | <keith_miller> | That's fair although I think it will have the same issue that the Map iterator has |
22:00 | <shu> | what's that? |
22:00 | <rickbutton> | does that mean you need to pass [coercer] for a Set? |
22:00 | <shu> | rickbutton: yes, i'd say so |
22:00 | <shu> | but that's only at Set creation time, which should be much rarer than actually using the Set |
22:00 | <rickbutton> | ew for the same reason as returning [newValue] from a Set coercer |
22:00 | <ljharb> | then you couldn't reuse the same options bad for a map and a set tho, which was the original complaint |
22:00 | <shu> | ljharb: why can't you? |
22:01 | <shu> | ljharb: you can pass an array with more coercers than will be used, the rest can be ignored |
22:01 | <ljharb> | ohh i see what you mean |
22:01 | <ljharb> | ok, sure |
22:01 | <shu> | it works for waldemar because it so happens that the "key" of the set is the only param, and the key for Maps is the 1st |
22:01 | <shu> | but there's no "deep" reason, it's just the order they appear |
22:02 | <keith_miller> | shu: If you do map.entries() you get [key, value], which is mostly annoying because destructuring uses array iterator |
22:02 | <drousso> | would be nice for `Map` tho if there's a way to coerce both the key and value at the same time (i.e. coerce the value based on the key) |
22:03 | <shu> | drousso: well, the current proposal falls short there too, right? |
22:03 | <drousso> | yeah |
22:03 | <shu> | keith_miller: yeah, but you do that iteration protocol presumably once, at creation time |
22:03 | <shu> | so maybe it's ok |
22:03 | <keith_miller> | Yeah, it's probably fine |
22:03 | <drousso> | im still not really convinced of the need/benefit of this over just modifying `map.set = function() { ... }` |
22:04 | <drousso> | but i don't have a strong opinion |
22:04 | <shu> | oh don't monkeypatch bro |
22:04 | <keith_miller> | drousso: use subclassing!! |
22:04 | <shu> | no |
22:04 | <drousso> | or subclassing |
22:04 | <shu> | no |
22:04 | <shu> | nooo |
22:04 | <michaelficarra> | we really need to have a conversation about how we expect subclassing to work in this language… |
22:04 | <shu> | i'll extend that sentiment, yes |
22:04 | <ljharb> | might be a relevant topic for this proposal |
22:05 | <michaelficarra> | and the previous topic |
22:05 | <keith_miller> | I expect it to work how I want to use it in the current circumstance :P |
22:05 | <ljharb> | shu: what a derived joke |
22:05 | <keith_miller> | Wait are we against subclassing now? |
22:05 | <drousso> | ^ +1 |
22:05 | <michaelficarra> | seriously though, I don't think we can make progress on some of these proposals without that conversation first |
22:06 | <rbuckton> | One thing I've considered proposing is providing a way to control equality in a Map/Set (essentially via `{ equal(a, b) { ... }, hash(a) { ... }`), which would only operate on the runtime value that determines existence in the collection. For a `Map` that's only ever the key, for a `Set` that's the key/value. As much as I'm in the camp of "A `Set` stores unique *values*", the similarity with how keys are |
22:06 | <rbuckton> | treated in `Map` and values are treated in `Set` is making me lean towards using `{ coerceKey }` for `Set` (where "key" means "the runtime value compared to other runtime values to indicate presence in the collection") |
22:06 | <keith_miller> | michaelficarra: but that didn't answer my question lol |
22:06 | <michaelficarra> | keith_miller: no, we just don't have a good way to do it |
22:06 | <keith_miller> | in what sense? |
22:07 | <michaelficarra> | see the Set methods proposal and our last discussion there |
22:07 | <keith_miller> | do you mean in the spec? |
22:07 | <keith_miller> | or for end users? |
22:07 | <michaelficarra> | do we make some core API that all operations observably go through? |
22:07 | <michaelficarra> | for end users |
22:07 | <shu> | keith_miller: i am against subclassing, yes |
22:08 | <michaelficarra> | how we design built-ins to support subclassing |
22:08 | <shu> | keith_miller: yulia and i have that proposal to kill subclassing |
22:08 | <michaelficarra> | shu: same, but that's different |
22:08 | <haxjs> | I guess most end users think Set only have value, no key... |
22:08 | <keith_miller> | I think of sets as only having keys lol |
22:09 | <keith_miller> | i.e. it's Map<Type, void> |
22:09 | <rkirsling> | ^ same but that's why we have both aliased |
22:09 | <shu> | i think of sets as having keys, yes |
22:09 | <ljharb> | keith_miller: `Set.prototype[Symbol.iterator].name` disagrees with you |
22:09 | <michaelficarra> | sets have "elements" which are analogous to map keys |
22:09 | <ljharb> | keith_miller: also `Set.prototype.keys.name` |
22:10 | <michaelficarra> | ljharb: those were arbitrary choices and you know it |
22:10 | <keith_miller> | lol |
22:10 | <ljharb> | perhaps so |
22:10 | <michaelficarra> | if we had considered that future committee might base a decision on it, we definitely would have made keys the canonical one |
22:10 | <ljharb> | but i also don't agree with the mental model that set elements are analogous to map keys (altho i recognize it's a valid model) |
22:10 | <keith_miller> | Not if I do Set.prototype.keys.name = keys |
22:10 | <keith_miller> | `Set.prototype.keys.name = "keys"` |
22:10 | <ljharb> | a Set is a list. that it has O(1) lookup doesn't make it have keys ¯\_(ツ)_/¯ |
22:11 | <michaelficarra> | ljharb: it's unordered, so it's a bag |
22:11 | <ljharb> | in JS it's quite ordered |
22:11 | <michaelficarra> | with uniqueness |
22:11 | <michaelficarra> | sure, JS sets are ordered |
22:11 | <Bakkot> | it's not a list because it's unique |
22:11 | <keith_miller> | yeah, it's definitely ordered in JS, which we should reconsider because memory |
22:11 | <Bakkot> | uniqueness = not a list |
22:11 | <keith_miller> | maybe needs to be a different type tho |
22:11 | <ljharb> | sure, but conceptually i think most JS devs think of sets as having values. |
22:11 | <rkirsling> | I mean in math sets have elements, and if you don't use a Set, then you effectively use a Map<T, bool> |
22:12 | <ljharb> | certainly there are domains where that mental model is the one that makes sense |
22:12 | <rkirsling> | so there's no precedent for calling them values, but it's also not to say that it's awkward to call them values |
22:12 | <shu> | i mean, the vox populi can also be wrong |
22:13 | <ljharb> | very true, but we still chose not to say mean things about ASI :-p |
22:14 | <rickbutton> | maybe not in the spec but I'll subtweet ASI all day |
22:14 | <Bakkot> | we shouldn't shame people for disagreeing with us but we can still take positions on things |
22:15 | <ljharb> | sure. but i don't think we're going to get consensus on a position that "sets have keys" |
22:15 | <haxjs> | agree with ljharb :P though i also understand why professional programmers would agree it's key ... hard to say which side is much "correct" :-P |
22:15 | <ljharb> | JS devs are professional programmers too. |
22:16 | <rickbutton> | neither is more correct, words have no meaning, the goal should be to satisfy the expectations of the developer (on average) |
22:16 | <michaelficarra> | keith_miller: btw this topic that Mark is asking about is exactly what I was talking about earlier |
22:16 | <keith_miller> | I missed it... |
22:16 | <rkirsling> | I mean given that we chose not to call it `elements`, it made sense to have `values` alias `keys` |
22:17 | <michaelficarra> | keith_miller: uggghhhh |
22:17 | <keith_miller> | sorry! |
22:17 | <rkirsling> | ...and it's fine that it's actually the reverse, _so long as_ we never require a user to know that |
22:17 | <ljharb> | rkirsling: the "so long as" isn't something we have consensus on either :-) |
22:17 | <haxjs> | ljharb: sorry, i mean senior devs may be more sensitive to some semantic attribute like "unique", so think it as key. |
22:17 | <michaelficarra> | keith_miller: whether you extend functionality by overriding some "core" set of methods or having to override every method, including any new ones added later |
22:18 | <keith_miller> | ah yeah |
22:18 | <michaelficarra> | there are pros and cons to each |
22:18 | <michaelficarra> | and we go back and forth constantly |
22:18 | <ljharb> | haxjs: perhaps. but i also know plenty of senior devs who think of it as having values. seniority doesn't require familiarity with advanced math concepts. |
22:18 | <keith_miller> | true lol |
22:18 | <michaelficarra> | ljharb: honestly it's probably more about formal education than years of experience |
22:18 | <ljharb> | perhaps so |
22:19 | <rickbutton> | I refer back to "words have no meaning" |
22:19 | <michaelficarra> | certain things, especially naming, are just passed down that way |
22:19 | <ljharb> | seniority and professionalism also do not require formal education. |
22:19 | <rkirsling> | agree |
22:19 | <Bakkot> | we should just pick random strings whenever this comes up |
22:19 | <rkirsling> | seniority seems irrelevant in this conversation |
22:19 | <Bakkot> | echo pwgen >> spec.emu |
22:19 | <ljharb> | right |
22:19 | <haxjs> | ljharb: sorry it's hard to express my meaning in accurate english word due to my poor english level... |
22:19 | <ljharb> | haxjs: nah i think i got what you meant! just wanted to clarify :-) |
22:20 | <shu> | words have so many meanings what you talkin about |
22:20 | <ljharb> | but yeah i think both are valid mental models. |
22:22 | <keith_miller> | Yeah I think keys vs values comes down to whether you took a bunch of abstract math clases |
22:22 | <keith_miller> | before learning to program |
22:23 | <rkirsling> | or well, just intro to discrete math really |
22:23 | <keith_miller> | at least that's probably why I see set as a typedef of Map<Type,unit> |
22:23 | <keith_miller> | discrete yeah |
22:23 | <keith_miller> | that's what I meant lol |
22:23 | <rkirsling> | but whether you've learned what a set is in school |
22:23 | <rkirsling> | and yeah "unit" would be more correct, I'm just thinking of it in terms of like |
22:24 | <rkirsling> | from a purely JS standpoint, even after Set was first available, it was still more common to do like |
22:24 | <michaelficarra> | yeah Unit is correct, I saw both Void and Boolean earlier and refrained from commenting |
22:24 | <rkirsling> | `{ key1: true, key2: false }` |
22:24 | <rkirsling> | err |
22:25 | <rkirsling> | `{ key1: true, key2: true }` |
22:25 | <haxjs> | I tend to support jordan's solution, allow any of it, but if provide both for Set, and not the same function reference, throw error... |
22:25 | <rkirsling> | my fingers keep making weird typos today |
22:26 | <haxjs> | Ooops, PLAIN date again? It's previous discussion decide to drop "plain" prefix? |
22:26 | <haxjs> | Isn't |
22:27 | <ljharb> | it's been PlainDate for awhile i think |
22:27 | <Bakkot> | https://github.com/tc39/proposal-temporal/issues/1072 |
22:28 | <haxjs> | So I miss that part... don't remember it been talked in the meeting, maybe I was sleeping in that meeting?? |
22:28 | <ljharb> | i doubt it was talked about in the meeting |
22:30 | <Bakkot> | I am in favor of just outright dropping subclassing support from this proposal |
22:30 | <Bakkot> | of all kinds, not just species |
22:30 | <michaelficarra> | agreed ^ |
22:31 | <michaelficarra> | until we have better motivation for it and a better plan for extensibility of built-ins in general |
22:31 | <haxjs> | though it's solely a bikeshed issue ,but I feel it's not very common to subvert previous decision without discussion in the plenary. |
22:32 | <haxjs> | Oh it seems the decision is based on twitter counts? 🤪 |
22:33 | <haxjs> | I remember many delegates don't like such thing? |
22:38 | <ljharb> | littledan: agree that it's unfair to put it all on Temporal; but when the existing pattern is "sometimes" i don't think it's a stretch to claim it's inconsistently applied |
22:38 | <keith_miller> | regexp... regexp is the worst lol |
22:38 | <shu> | Bakkot: yes, ofc me too |
22:38 | <shu> | especially because it's a group of classes all interacting |
22:38 | <Bakkot> | I think there's a good argument for this proposal being unique in this regar: it is a collection of classes |
22:38 | <Bakkot> | yeah, that |
22:39 | <ljharb> | right |
22:39 | <Bakkot> | anyway that's my queue item up next |
22:39 | <michaelficarra> | I'm very happy we're at least starting this conversation right now |
22:40 | <michaelficarra> | like, beaming |
22:40 | <michaelficarra> | and everyone is being very thoughtful and respectful :-) |
22:40 | <ljharb> | Bakkot: do you mean like, "throw if `new.target` isn't the base class"? |
22:40 | <shu> | i think that part is "fine" |
22:41 | <ljharb> | which part |
22:41 | <shu> | but i want methods to just do Construct(%Temporal.Foo%) |
22:41 | <ljharb> | right but that would mean we couldn't add subclassing later, if that's what we decide to do |
22:41 | <shu> | ljharb: i was saying the fact that you can type "new (class foo extends Temporal.Foo {})" and doesn't throw seems "fine" |
22:41 | <ljharb> | because people would have made subclasses and relied on it producing a base class instance |
22:41 | <littledan> | ljharb: I don't think our pattern is "sometimes". We have different analyses of what JavaScript has right now. You were conflating protocols and implementations in your listing. |
22:41 | <ljharb> | whereas if it throws, then nobody can have possibly made a base class until we're ready to let them |
22:42 | <shu> | ljharb: DOM heavily depends on that kind of subclassing |
22:42 | <shu> | the magic method instance creation, not so much |
22:42 | <ljharb> | shu: right but temporal isn't dom |
22:42 | <ljharb> | littledan: hm, ok. surely worth trying to get all of us on the same page about that analysis |
22:42 | <shu> | yes, that's true, and part of Bakkot's argument |
22:42 | <littledan> | I'd be up for removing @@species in Temporal, but there's a ton of other stuff going on in the TimeZone and Calendar protocols... |
22:42 | <ljharb> | littledan: if i can be made to understand that there is in fact a currently applied consistent mental model then that would be really helpful |
22:43 | <littledan> | well, I mean, we discussed it last meeting; I'm not sure what more to discuss |
22:43 | <littledan> | people proposed new possible changes, but I described what we do today |
22:44 | <ljharb> | let's find a time to discuss offline; what you described in the last meeting isn't a consistent model to my understanding, so perhaps there's something i'm missing |
22:46 | <michaelficarra> | ystartsev: I think the "cautious" route is actually not supporting any kind of extensibility until we have a clearer plan |
22:46 | <shu> | ystartsev: i also think the cautious route isn't actually web compat |
22:46 | <shu> | wait, no |
22:46 | <shu> | it's fine |
22:46 | <Bakkot> | ystartsev shu: to be clear I was only making an argument for what we should do with _this_ proposal, not for other cases, so there's no potential web compat issue |
22:46 | <shu> | right, yes |
22:47 | <shu> | wait, it can't be a SyntaxError |
22:47 | <shu> | it can be a TypeError or something |
22:47 | <ystartsev> | tbf i am multitasking so i was a bit surprised by the question. I need to think about it more, and don't have a confident answer yet. |
22:47 | <michaelficarra> | I don't understand, what syntax error? |
22:47 | <shu> | misunderstanding sounds like |
22:47 | <shu> | runtime error |
22:48 | <Bakkot> | I would kind of lean towards not making it an error but only very weakly |
22:48 | <haxjs> | Can I ask how to make it runtime error? |
22:48 | <shu> | i want extends to work, still, but i don't really have a good reason |
22:48 | <Bakkot> | haxjs: you say "if new.target is not [the right thing], throw" |
22:48 | <littledan> | I started a broader thread about hooks and optimizability, to speak more to Yulia's point. I really think that it will be hard to make the more non-trivial tradeoffs (beyond @@species) in the air, and it's better to make the tradeoffs in the context of an implementation that is developed. https://github.com/tc39/proposal-temporal/issues/1432 |
22:49 | <Bakkot> | haxjs concretely, see step 1 of https://tc39.es/proposal-temporal/#sec-temporal.plaindate |
22:49 | <shu> | littledan: let's separate the "hooks is the future" thread and the "how possible is Stage 3 for Temporal that removes all subclassing and have no hooks" |
22:49 | <Bakkot> | it would change to `If NewTarget is not %Temporal.PlainDate%` |
22:49 | <littledan> | I kinda feel like we might as well let extends work, just not do anything in particular to make it work *well* (like use the constructor of instances) |
22:49 | <ljharb> | shu: i would argue that extends doesn't work, if methods don't produce subclass instances |
22:50 | <haxjs> | Intesting, but could people still use old ES5 way to make it work? |
22:50 | <littledan> | Ujjwal just answered Richard's question |
22:50 | <Bakkot> | haxjs no, these can't be called without `new` |
22:51 | <Bakkot> | or, maybe I don't know what you mean by "the old ES5 way" |
22:51 | <rickbutton> | isn't the answer that "stage 3 is not 'ship' it's 'implement'"? |
22:51 | <ljharb> | haxjs: `new.target` works the same way in ES5 constructors, and can constrain them the same |
22:51 | <ljharb> | rickbutton: it's both |
22:51 | <Bakkot> | yeah, it has to ship before stage 4 |
22:51 | <michaelficarra> | rickbutton: no, we usually mean ship |
22:51 | <rickbutton> | do we mean ship behind flag or ship unflagged? |
22:51 | <ljharb> | rickbutton: engines are free to ship without a flag immediately once it hits stage 3, and are encouraged to do this quickly (not necessarily encouraged to lack a flag, ofc) |
22:52 | <rickbutton> | ok |
22:52 | <ljharb> | rickbutton: stage 4 requires 2 unflagged |
22:52 | <michaelficarra> | depends on the proposal, but we usually want web compat feedback, not just implementability feedback |
22:52 | <rickbutton> | right, makes sense, thx |
22:52 | <haxjs> | I mean u can just get the instance, change the prototype? |
22:53 | <ljharb> | rickbutton: in general any time there's an observable change after stage 3 advancement, it's either motivated by web compat, implementability, or we should have caught it before stage 3 |
22:53 | <ljharb> | haxjs: sure, but that's fine, that's not proper subclassing |
22:54 | <haxjs> | "we should have caught it before stage 3" --- what if we failed to caught it ? |
22:55 | <michaelficarra> | I'm also thankful that the champions chose an appropriate timebox for this topic |
22:55 | <ljharb> | haxjs: then we may, or may not, be able to change it |
22:55 | <ljharb> | haxjs: but that's why the risk of that kind of changes is supposed to be effectively zero before stage 3 advancement |
22:56 | <shu> | rickbutton: "shipped" simpliciter usually means "unflagged" |
22:56 | <rickbutton> | 👍 |
23:00 | <michaelficarra> | did they think they had to define a total ordering? |
23:00 | <michaelficarra> | a partial ordering seems fine |
23:01 | <ljharb> | Bakkot: https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html says "It is strongly recommended (though not required) that natural orderings be consistent with equals." |
23:01 | <michaelficarra> | ljharb: partial ordering can still be consistent |
23:01 | <ljharb> | iow yes, it's not required there, but it's also not "wrong" |
23:01 | <Bakkot> | ljharb it also says "One exception is java.math.BigDecimal, whose natural ordering equates BigDecimal objects with equal values and different precisions (such as 4.0 and 4.00)." |
23:01 | <ljharb> | sure |
23:01 | <Bakkot> | which is exactly this case: |
23:02 | <Bakkot> | the points are the same on the line in question, they just have extra data |
23:02 | <Bakkot> | so the sort the same, but are not equal |
23:02 | <ljharb> | Bakkot: ftr i think your example is very compelling, where sorting would give you the wrong timeline order. |
23:02 | <Bakkot> | *they sort the same |
23:02 | <ljharb> | and obviously you can write all sorts of comparators that return 0 for two unequal things |
23:04 | <Bakkot> | yeah I mean it is true that it is usually a good idea for them to agree |
23:04 | <Bakkot> | just that it isn't a hard requirement, and I think that cases like this are exactly where the requirement should be violated |