2023-05-02 [09:24:08.0967] > <@littledan:matrix.org> We definitely could have done accessors for fields. It would have certain advantages and disadvantages. I am also very confident that, if we did that, people would have said “this has lots of footguns, look this basic code doesn’t work as expected” enumerability of accessors is likely one of those footguns on the other side. [09:24:23.0265] > <@littledan:matrix.org> We definitely could have done accessors for fields. It would have certain advantages and disadvantages. I am also very confident that, if we did that, people would have said “this has lots of footguns, look this basic code doesn’t work as expected” * non-enumerability of accessors is likely one of those footguns on the other side. 2023-05-03 [05:22:11.0137] Could I get push access to https://github.com/tc39/proposal-json-modules, to "rebase" it on top of the updated import attributes proposal? [10:05:16.0190] PSA: deadline for advancement eligibility is in slightly less than two days [10:05:33.0890] for the May meeting [10:05:34.0789] (also the link to the countdown timer in the agenda is broken) [10:15:26.0101] fixed the link [12:39:47.0128] who owns `tc39.es`? did someone mess with the DNS settings recently? looks like the subdomain we were using for PR previews is gone [12:42:17.0460] Registrant Ecma International [12:42:21.0385] fascinating [12:42:40.0523] /facepalm [12:43:02.0021] we could and maybe should switch to just using github pages, I guess [12:43:44.0620] also interesting that `.es` has no whois server [12:43:46.0706] (which would solve the problem by not being a subdomain, to be clear) [12:58:10.0517] The DNS has been recently transferred to Ecma, there is some discussion in #tc39-website:matrix.org [13:00:24.0200] Ecma does not have a good track record of having working technical infrastructure [13:00:30.0915] why... was that done [13:05:52.0161] The DNS was metered. Aki's bill rose dramatically following a DDoS attack. We asked Ecma to switch to unmetered DNS. [13:06:09.0830] s/bill/cheque for US folk [13:06:56.0659] I was not aware that it was possible for DNS to be metered [13:07:01.0350] * s/bill/check for US folk [13:07:16.0357] AWS have more ways of making money than you may imagine. [13:09:23.0366] wow [13:09:36.0990] i'm learning a lot, all of it unpleasant [13:18:06.0387] Lol my bill went from 1¢/month to… I haven’t checked in a minute. It was like $40 last I checked but on its way to $100 if traffic continued. [13:35:20.0149] $100 of dns queries is a distressing amount of dns queries [15:26:06.0080] bakkot: probably my fault. I must've missef a non-AWS A record. just let me know and I can add it [15:26:16.0647] * bakkot: probably my fault. I must've missed a non-AWS A record. just let me know and I can add it [15:26:28.0976] * bakkot: probably my fault. I must've missed a non-AWS A record. just let me know and I can add it [16:03:48.0054] > <@softwarechris:matrix.org> bakkot: probably my fault. I must've missed a non-AWS A record. just let me know and I can add it it's the `ci.tc39.es` record, if you still can find the original ones [16:04:50.0868] > <@nicolo-ribaudo:matrix.org> Could I get push access to https://github.com/tc39/proposal-json-modules, to "rebase" it on top of the updated import attributes proposal? done [16:32:14.0111] good to go 2023-05-04 [05:41:50.0218] Rob Palmer: Hi! A colleague from a different team at Mozilla just asked me about attending the upcoming plenary as an observer. Is there any process that needs to be followed for that, or can they just show up? [05:42:54.0733] I think just notifying on the reflector thread should suffice [06:47:08.0279] The July plenary meeting is coming up and it scheduled to be in Bergen, Norway! - https://github.com/tc39/Reflector/issues/471 Please fill out [the interest survey](https://github.com/tc39/Reflector/issues/471) by Wednesday so that we can predict attendance numbers and make a call on whether it will be hybrid or remote-only. [07:22:24.0602] Do we have an issue tracking the details of the June plenary? I was having trouble finding one. [08:01:25.0808] We have [the May plenary](https://github.com/tc39/Reflector/issues/470) next. [15:39:48.0012] is there some canonical example somewhere of "promise ticks are observable"? [15:41:07.0232] shu: ``` (async () => { for (let i = 0; i < 100; ++i) { console.log(i); await 0; } })(); // other stuff here ``` [15:41:25.0948] order in which the `console.log`s fire relative to other effects in other stuff is observable [15:41:36.0588] that said engines are wildly inconsistent in a lot of cases so like [15:41:40.0306] don't worry too much about it [15:41:45.0708] users certainly shouldn't [15:48:10.0489] thanks 2023-05-05 [21:11:16.0451] I certainly hope the number of ticks is not something programs are not sensitive to since we have the faster promise adoption proposal that would likely change that. [23:58:07.0973] Are there normally automated Chinese-language spambots commenting in the tc39/proposals repo? I just posted an [issue](https://github.com/tc39/proposals/issues/470) there and got two Chinese-language responses within 4 minutes. General question: what's the normal process for dealing with spam comments in TC39 repos? [23:59:40.0705] * Are there normally spambots commenting in the tc39/proposals repo? I just posted an [issue](https://github.com/tc39/proposals/issues/470) there and got two Chinese-language responses within 4 minutes. General question: what's the normal process for dealing with spam comments in TC39 repos? [00:21:14.0774] What I have assumed in the past is that everyone with the appropriate permissions can simply delete spam comments without needing special permission (unlike bad behavior, best referred to the code of conduct committee). If they are persistent, you can escalate to the CoC committee or any chair to get a ban out in place. [08:12:56.0041] let’s not delete things since that leaves no record; certainly hide them as spam tho [15:19:30.0652] I’m a delegate of Indiana University but I’ll be leaving in June. I’m co-champion on several proposals, I’m interested in continuing to participate in TC39 afterwards – e.g., as an invited expert. What should I do to start that process? [15:19:40.0806] * I’m a delegate of Indiana University but I’ll be leaving in June. I’m co-champion on several proposals, and I’m interested in continuing to participate in TC39 afterwards – e.g., as an invited expert. What should I do to start that process? [15:30:09.0987] jschoi: the https://github.com/tc39/Admin-and-Business/blob/main/.github/ISSUE_TEMPLATE/delegate-to-invited-expert.md issue template points to https://www.ecma-international.org/invited-expert-form/ for you to fill out - so i think if you fill that out and file an issue that'd kickstart the process? [15:32:14.0963] jschoi: I've been trying to reach you regarding `Array.fromAsync` [15:32:27.0201] I've added a topic to the upcoming plenary's agenda about it [15:32:28.0384] see https://docs.google.com/presentation/d/1mww3D5CO1uebUYiK7l8O5GLjUR98NJYgeHGxQEgnrNA/edit#slide=id.g23957a99532_0_0 2023-05-06 [17:22:57.0470] > <@michaelficarra:matrix.org> jschoi: I've been trying to reach you regarding `Array.fromAsync` My apologies for being lost to contact; I’ve been swamped with internal work over the past months. I will read this issue tomorrow and reply to you there. [20:06:10.0023] > <@michaelficarra:matrix.org> jschoi: I've been trying to reach you regarding `Array.fromAsync` * My apologies for being lost to contact; I’ve been swamped with internal work over the past months. I will read this issue tomorrow and reply to you privately. 2023-05-07 [12:28:55.0591] Hey all, a reminder that the Interest Survey for the July plenary in Norway is now up. It takes 30 seconds to add yourself. Even if you plan to dial in, that information is useful. Thank you to the 14 people who have already provided their intentions. https://github.com/tc39/Reflector/issues/471 2023-05-08 [18:59:43.0488] anyone gonna be at gamescom? [11:20:02.0363] Orama is allowed to attend the TC39 plenary next week, right? [13:21:11.0130] littledan: (RE `Array.prototype.group`) I think the answer to "how do we choose web-compatible `Array.prototype` method names?" is obvious but we just don't want to accept it: stop trying to choose good names [13:22:11.0055] Michael Ficarra: There's something in common with the `group` name as the previous `global` name: people searched for the name and found too many results, so it was too much to look through, and they sort of assumed it was compatible (but without reporting all of that logic to the committee in advance). In the future, if a search yields that sort of result, I think the next step is to choose something else. [13:22:14.0358] so, I agree [13:22:16.0769] bad/verbose names are much less risky, but we *want* the name to be good, so we take the risks anyway [13:23:23.0362] I think for Array methods in particular, we should just use things that we can demonstrate to be pretty unique [13:23:34.0761] Array methods have been found to be uniquely risky unlike anything else [13:23:43.0514] yes, we need an especially high bar for Array prototype method names [13:24:08.0180] evidence of compatibility, not just lack of evidence of incompatibility [13:24:50.0777] well, I'd like that if someone could provide it, but I'm not sure what such evidence would look like [13:25:03.0673] what advice would you give to a new delegate who wants to take on the Array grouping project? [13:25:47.0391] a *new* delegate? "don't" [13:26:09.0840] OK, then, an experienced delegate--what would you tell them to do? [13:26:14.0839] "hi I'm new here, let me try to solve this override mistake for y'all" [13:27:01.0787] if code search can show a name is effectively nonexistent on the web, that would be good evidence [13:27:20.0568] that would probably necessitate a pretty terrible name choice though [13:27:51.0263] previously people tried GitHub code search and found results which initially appeared to be stronger support than what was ultimately shown [13:28:12.0802] Let's try to give actionable advice to champions here (or declare bankruptcy on Array methods and just not do them) [13:28:36.0645] if they wanted to straddle the middle, they would have to do something like collect/analyse usage info in a large-ish browser [13:29:08.0332] yeah, GitHub code search should not be considered sufficient, most code is not OSS [13:29:26.0279] people always say "analyze usage in a browser" but that doesn't really seem to be available in practice [13:29:44.0031] I dunno if it ended up playing a role in `global` with some kind of work with Edge, but I haven't heard of it being used since [13:30:07.0982] this is more awkward than adding other kinds of telemetry/usecounters since it's a property that doesn't exist [13:32:21.0087] may be awkward, but I don't see why it couldn't be done (by someone with the authority to ship in said browsers) [13:32:53.0314] I just don't know how to do it (and I've contributed code which shipped in browsers after stopping working directly for one) [13:33:11.0072] maybe you see a way to do it that I don't? [13:34:43.0425] like, it'd be too slow to replace Array.prototype with a Proxy or something [13:36:17.0025] I was thinking a magic property like `document.all` which appeared not there but reported a use counter when assigned/defined [13:36:23.0023] I'm not talking about an existing facility here [13:37:03.0141] `Array.prototype.length` is already magical [13:37:33.0435] I think property access on `Array.prototype` has to be faster than property access on `document`. And the magic of `length` is baked into a lot of places and difficult to replicate. [13:38:17.0936] Anyway, if we want to call a pause on Array methods until someone puts in the work to do this very strong dynamic analysis, that's a conclusion we could come to, we should just expect this to take a long time. [13:40:28.0718] I'm personally okay with either approach: raise the bar so we can confidently ship come stage 3, or move to stage 3 with an unknown name, accepting that we may need to unship and retry with a new name an unbounded number of times before moving to stage 4 [13:40:49.0313] browser implementors may have a different opinion though [13:41:18.0906] yeah it'd be nice if we could find some strategy where the champion can be the one doing the work, rather than just implementers. Maybe some kind of search in HTTPArchive? [13:49:54.0963] > people always say "analyze usage in a browser" but that doesn't really seem to be available in practice most definitely not scalable [13:50:38.0149] > may be awkward, but I don't see why it couldn't be done (by someone with the authority to ship in said browsers) the "awkwardness" you refer to is really "unacceptably slow and cannot be shipped" [13:50:45.0180] it's not "impossible" [13:50:54.0915] well, it's in practice impossible [13:51:01.0078] but not impossible in the sense that like, we don't know how to code it [13:52:00.0496] a difference between JS engines and this kind of telemetry on other web APIs defined in WebIDL is the performance pressures are probably an order-of-magnitude different [13:52:23.0797] if you could get google and apple and mozilla to stop competing on performance at all then we can talk! [13:54:59.0266] oh and microsoft [13:55:17.0646] to be clear: we want you to keep competing on performance [13:58:18.0797] yes sorry this is all a bit tongue in cheek. i don't think the current state of things is wrong: the optimal state of a widely used and supported language most likely should not be optimized for ease of changing [14:38:01.0831] > <@littledan:matrix.org> well, I'd like that if someone could provide it, but I'm not sure what such evidence would look like Evidence of compatibility is something we get all the time for web-platform features. In Chrome, we add a Use Counter and (usually) wait until it hits the Stable channel, and see what the usage is. [14:38:31.0881] If it's super low, great. If not, we can dig into exactly what the usage is and see if it's innocent or not, but that does require more manual labor. [14:39:32.0095] what does a use counter look like for assessing compatibility of a new `Array.prototype` method? [14:39:43.0175] At least, I *presume* Use Counters are plumbed into the JS engine enough to be usable. [14:39:43.0596] i've added use counters mainly to assess the compatibility of removing things [14:40:05.0622] we have plenty of use counters, but they aren't free and some things are much easier to track than others [14:40:06.0884] Use Counters are definitely plumbed through V8, I just don't know how to efficiently add a counter for this sort of thing [14:40:10.0294] Whatever c++ gets invoked for expandos, the use counter would monitor, I presume. [14:40:29.0882] yeah they're not free, but we still have a bajillion of them bc they're useful [14:40:35.0098] alas it is not C++ but like, 10 different places across C++ and generated code (handwritten assembly) [14:40:47.0848] i guarantee you adding a check to Array.prototype object lookups will regress speedometer [14:40:50.0515] and we will back it out [14:41:14.0571] lol, well a telemetry run on nightly might be enough [14:41:32.0870] at least to give initial results, which probably would have shown the .group usage was high [14:43:36.0861] i think our performance mental models significantly differ [14:43:41.0049] mainly because you said expandos [14:47:36.0849] lol [14:49:30.0198] An attempt to get a given property name from the Array.prototype object. 2023-05-09 [15:18:26.0636] > <@shuyuguo:matrix.org> i guarantee you adding a check to Array.prototype object lookups will regress speedometer Is this done by analyzing the creation of, or transition to, a new map that has an JS_ARRAY_TYPE type, or are you talking about patching actual assignments (i.e., to catch code that may not have moved to the optimizing compiler)? [15:22:44.0497] well, i elided a few thoughts [15:23:29.0218] i don't think it's sufficient to just check if e.g. someone added a new property named `group` to `Array.prototype`, because we know unconditional assignment is unproblematic [15:24:15.0807] so to add a more nuanced check that's a better measure of whether there's a problematic assignment to a particular `Array.prototype` name: 1. i don't know how to write that use counter 2. it's probably spread through enough parts of the code that adding that many branches is slow? [15:25:25.0388] we _could_ probably add a check just to see if someone added a new property named `group` to Array.prototype but i'd need to audit for all the places where we do that [15:32:10.0529] the actual problem with `group` was triggered by someone relying on the _absence_ of a property named `group` on array objects, IIRC [15:32:26.0040] so you'd need a use counter for lookup, not just assignment [15:32:30.0766] right, that's what i obliquely referred to as "lookup" [15:32:58.0189] i can imagine a use counter "through time" like, if i looked up 'group' then assigned to 'group', then maybe we bump the counter [15:33:05.0959] but there is just no way i can add a branch to every lookup [15:34:04.0412] > <@bakkot:matrix.org> the actual problem with `group` was triggered by someone relying on the _absence_ of a property named `group` on array objects, IIRC But did they then still assign to it, or just test for its presence and that's it? [15:34:11.0032] just test for presence [15:34:22.0102] oh they didn't even assign to it? [15:34:22.0758] they were using it as a type discriminant [15:34:37.0739] word [15:34:39.0824] ain't nothing i can do [15:36:08.0178] https://github.com/webcompat/web-bugs/issues/112552#issuecomment-1291374679 [15:36:12.0372] specifically that case ^ [15:36:13.0742] there were others [15:36:38.0198] that is, there were other cases which were doing other more normal things, which a use counter might have been able to detect [15:36:50.0081] but this specific one was doing the type discriminant thing [15:38:37.0805] do you wonder what life would be like if you worked on a language that had just a little bit less baggage [15:38:42.0086] not a lot, maybe just like 10% less [15:39:38.0227] > <@shuyuguo:matrix.org> do you wonder what life would be like if you worked on a language that had just a little bit less baggage Like, one where the version can change but it doesn't break your code because your code is compiled and linked to a version-specific standard library? [15:42:38.0491] like chris lattner has it figured out man [15:42:43.0341] occasionally I stare forlornly across the bay in the direction of rust [15:42:45.0474] make a language, go somewhere else, make another language [15:44:55.0628] > <@bakkot:matrix.org> https://github.com/webcompat/web-bugs/issues/112552#issuecomment-1291374679 Wait, so the issue is the method must exist, but old code is relying on it being falsy. This kinda rings a bell. Haven't we solved this problem once before...? [15:46:06.0326] whenever I suggest `document.all` as the solution to all our problems people start screaming in horror and also ominous chanting starts up and blood starts leaking from the walls [15:46:10.0244] so I've stopped suggesting it [15:46:48.0519] The chanting and blood leaks are a bug in our piping infrastructure, there's an issue open years ago [15:47:03.0545] we can simply extend the MOP to include `emulates: val` [16:25:39.0560] Hey all, a reminder that the Interest Survey for the July plenary in Norway will close in 24 hours time. It takes 30 seconds to add yourself. Even if you plan to dial in, that information is useful. Thank you to the 25 people who have already provided their intentions. https://github.com/tc39/Reflector/issues/471 2023-05-11 [06:41:23.0621] The Chairs have decided the July 2023 TC39 plenary will happen in Bergen 🎉 Thank you to the 32 people who filled in the survey. Full details are on [the Reflector post.](https://github.com/tc39/Reflector/issues/473) 2023-05-13 [09:36:43.0084] Draft schedule on reflector now [09:37:07.0066] Thanks Luca Casonato and nicolo-ribaudo 2023-05-15 [01:46:46.0434] What's the "TKTKTK intro" that's occupying the first hour of the schedule? Searching online suggests mainly ASMR videos, which would be a bit weird. [01:56:13.0646] It was a placeholder for the various initial reports; I helped ryzokuken preparing the schedule and forgot to replace it 😅 [01:56:42.0916] * It was a placeholder for the various initial reports (secretary, editors, etc); I helped ryzokuken preparing the schedule and forgot to replace it 😅 [03:05:25.0630] TC39 starts in around 5 hours, right? [03:05:39.0501] (Am I calculating correctly?) [03:09:45.0773] Yep, according to the TC39 calendar [04:29:35.0460] oops, sorry, I'll do that now [04:29:49.0329] but it's supposed to be the opening of the meeting [05:43:21.0760] Does that 60 minute topic include Samina’s introduction? [05:43:29.0723] Yeah [05:43:56.0643] I've had a meeting come up so won't be able to make the first hour or so [05:44:20.0224] don't expect to be presenting then but just in case [05:45:02.0487] ryzokuken: how do you expect the time to divide up within that segment? [05:48:31.0748] just updated the hackmd [05:48:37.0471] apologies again for doing this last minute [05:50:12.0695] Np thanks [08:17:52.0377] I'm getting an error "Couldn't connect you to the video call" when following the Google Meet sign-in link. Is this just me? [08:18:30.0905] there are 33 people in the meeting right now [08:18:31.0381] yes, we have 33 people in here [08:19:04.0637] Are the slides frozen to the first one? (not that I'm missing much, but...) [08:20:06.0357] Got in by trying again. Dunno what was wrong. [08:22:38.0784] the first time i connected i heard no audio, i had to drop out and reconnect, definitely something a bit weird [08:27:43.0720] s/master/authoritative/; s/slave/derived/ [08:27:58.0735] (this also explains it more clearly!) [08:30:14.0983] "we need a solution for pdf generation in 2024" needs to further define "we" [08:30:17.0568] i assume we all realize that the graph dropped there because we started hosting it on github then, not because of the pdf [08:30:35.0819] "we" means Ecma, not any TC39 volunteers [08:30:44.0782] print-to-pdf is a solution for pdf generation [08:30:49.0253] correct [08:31:02.0534] as is ecma providing the budget we've asked for for years for professional typesetters [08:32:35.0421] I am happy to believe that this PDF is downloaded more than any other PDF ecma provides but that doesn't actually make it important per se [08:33:10.0352] also an earlier slide implied that PDF quality impacts downloads, and that 402's PDF is better, but 402's PDF is a tiny fraction of 262's PDF. [08:33:17.0436] It sounds like it may be important to ECMA, but not to TC-39. [08:33:18.0874] * also an earlier slide implied that PDF quality impacts downloads, and that 402's PDF is better, but 402's PDF downloads is a tiny fraction of 262's PDF. [08:33:24.0082] surely, if the PDF was not available, people would use the HTML version instead, right? [08:33:32.0150] eemeli: yes, that's a statement of fact [08:34:49.0565] I'm curious which things are missing from print layout in CSS/browsers to be good enough for ECMA [08:34:59.0072] glad to hear the json spec is approved for the next 5 years [08:35:09.0511] > <@ljharb:matrix.org> also an earlier slide implied that PDF quality impacts downloads, and that 402's PDF is better, but 402's PDF downloads is a tiny fraction of 262's PDF. I'm not sure if I'd say that the PDF quality is "better" since what we do is basically print-to-pdf with some tiny CSS tweaks [08:35:26.0619] it's not just about browsers, there are print formatters that are developed especially for printing (PrinceXML, Antennahouse etc). There are entire books typeset in HTML & CSS using these [08:35:50.0063] > <@usharma:igalia.com> I'm not sure if I'd say that the PDF quality is "better" since what we do is basically print-to-pdf with some tiny CSS tweaks yeah i'm sure it's just that 262 has some content that makes it worse than 402, i was just pointing out the problem with istvan's argument [08:36:30.0529] > <@usharma:igalia.com> I'm not sure if I'd say that the PDF quality is "better" since what we do is basically print-to-pdf with some tiny CSS tweaks * yeah i'm sure it's just that 262 has some specific content that makes it print worse than 402, i was just pointing out the problem with istvan's argument [08:36:41.0829] honestly it would be good to have a summary of topics like Istvan's, to understand what the main points are (I think this is usually not clear to the committee) [08:38:20.0672] also this kind of seems like it should be its own agenda item, not part of the secretariat's report [08:38:51.0640] What do you mean, Samina's introduction? [08:39:10.0558] She did put it on the agenda, and you can blame me if you think she did so in an incorrect way (as I walked her through that process of the agenda edit) [08:39:45.0025] Do you have any particular questions or concerns for Samina? [08:42:24.0468] no no, i meant istvan's PDF concerns [08:42:31.0826] samina's topic was on the agenda and is perfectly fine [08:42:43.0152] * no no, i meant istvan's PDF concerns that we'd been discussing in chat [08:42:55.0338] * samina's topic was on the agenda and is perfectly fine, i met her last week and am happy to welcome her [08:43:11.0867] I don't want the pdf topic to be its own agenda item because I don't want to spend more time on it [08:43:31.0030] i agree, but it seems easier to convey that if it's separated :-) [08:43:37.0571] surprisingly 262 *does* have camel case AO names (though we are working on fixing that) [08:43:43.0535] fair [08:43:46.0151] hehe yeah I think it concerns a small group of people and that group is sort of in touch by an email thread [08:43:50.0393] otherwise it'll be snuck into the secretariat's report for another year [08:44:48.0806] well, Samina is onboarding here; I think we may see different communication styles here over time [08:44:49.0360] i'm confused, why were we talking about normative changes in this section [08:44:52.0827] I'm pretty optimistic [08:44:59.0982] this was just a status update, not a consensus item [08:45:37.0983] normative 402 changes are always run by TG1 [08:45:42.0056] > <@ljharb:matrix.org> i'm confused, why were we talking about normative changes in this section This is frequently done in ECMA-402 updates. [08:45:51.0298] but it'd also be fair to ask for more explanation and discussion [08:45:51.0302] that's not my recollection, but ok [08:46:02.0963] we don't do that in 262 updates, and i definitely want more explanation than "go look at the PR" [08:46:04.0341] it's true that it'd be nice to have more proactive support from the committee [08:46:27.0341] we have a separate section for "needs consensus" [08:46:43.0875] > <@ljharb:matrix.org> we don't do that in 262 updates, and i definitely want more explanation than "go look at the PR" the thing is, Ujjwal did explain the change, and also when there have been longer presentations here, they haven't gotten much engagement [08:46:55.0206] yes because TG1 members are expected to be much more familiar with 262 and 402 [08:47:10.0303] * yes because TG1 members are expected to be much more familiar with 262 than 402 [08:48:13.0975] can the code of conduct committee update their membership list? [08:48:18.0070] (sorry I haven't gotten the queue up yet) [08:48:22.0389] it should be up to date [08:48:40.0669] in what sense? it contains multiple people who are not delegates [08:49:08.0238] if you have an idea of which 4 people are somewhat active, then shouldn't the list reflect that? [08:49:26.0409] everyone on the list is a delegate as far as i'm aware. [08:49:37.0453] and we haven't previously evicted people for not attending meetings [08:51:09.0023] regarding engagement, it's not that they need to be longer, it's that the agenda didn't include the item, nor any supporting materials, 10 days prior to the meeting, so how could anyone have reviewed it [08:51:23.0167] there's lots of reasons normative changes have their own section, and need their own item. [08:52:06.0506] * regarding engagement, it's not that they need to be longer, it's that the agenda didn't include the item, nor any supporting materials, 10 days prior to the meeting, so how could anyone have reviewed it or known they needed to [08:52:24.0671] * regarding engagement on 402 items, it's not that they need to be longer, it's that the agenda didn't include the item, nor any supporting materials, 10 days prior to the meeting, so how could anyone have reviewed it or known they needed to [08:59:15.0933] ljharb: I understand your concerns but at the same time this is how we've dealt with normative Intl stuff so far [08:59:43.0066] i guess i've missed it. but either way the specific items *must* be referenced on the agenda, 10 days in advance, per our policy [08:59:51.0086] * i guess i've missed it. but either way the specific items _must_ be referenced on the agenda, 10 days in advance, per our current policy [09:00:05.0386] but I'm not against presenting every normative change as a separate item if that's useful [09:00:36.0303] i don't personally care if it's one "402 normative changes" item, or separate items, or whatever, i just care that it's called out with supporting materials on the agenda [09:00:45.0667] * i don't personally care if it's one "402 normative changes" item, or separate items, or whatever, i just care that it's called out with supporting materials on the agenda, like every other normative change we approve [09:00:47.0063] Yes, I agree that normative changes should be posted in advance like that, and for this topic it'd be reasonable to ask for an overflow item if you want to go into more detail [09:01:00.0207] * i don't personally care if it's one "402 normative changes" item, or separate items, or whatever, i just care that it's called out with supporting materials on the agenda, like every other normative change we approve (and it's confusing to me to do it under "status report") [09:01:11.0497] i don't, on this specific item, i'm speaking in general [09:01:15.0665] * i don't, on this specific item, i'm speaking about in general [09:01:34.0177] * i don't personally care if it's one "402 normative changes" item, or separate items, or whatever, i just care that it's called out with supporting materials on the agenda, like every other normative change we approve (and it's confusing to me to do it under "status updates") [09:02:03.0045] omg I don't remember this issue at all [09:02:13.0194] I mean I don't remember posting it [09:04:36.0010] It seems the issue mentioned wasm might allow 2**53 bigger Arraybuffer? [09:06:04.0651] like we're not going to have computers in the medium term future with that kind of memory i don't think? [09:06:48.0711] yeah but virtual memory [09:07:05.0711] In general, don't we want to write the summaries collectively? [09:07:08.0622] as long as you don't actually try to _use_ all the pages you can still pretend [09:07:10.0000] like, synchronously in the meeting [09:07:16.0020] rather than just telling the presenter to write something [09:07:20.0271] ehhh maybe virtual [09:07:21.0631] that way we can be sure we actually agree on it [09:08:14.0418] > <@littledan:matrix.org> that way we can be sure we actually agree on it we can do that, but it could get somewhat time consuming [09:08:53.0066] but we're not so pressed for time this time around so it shouldn't be a problem I suppose [09:08:55.0898] yes, I think we previously at least paused for a moment till the conclusion was in reasonable shape [09:09:25.0195] alright then I'd pause a bit for the next items [09:10:36.0005] also allows the person writing the conclusion to participate in the next topic, rather than focused on the conclusion and missing the presentation [09:11:12.0728] > <@usharma:igalia.com> we can do that, but it could get somewhat time consuming well, concretely, pausing synchronously is what I had proposed to the committee. In the past, when we *didn't* pause, we just didn't get summaries. [09:14:59.0960] IMHO, this feels like we're waisting time. [09:15:38.0842] That is useful to help us report back on our internal meetings. [09:16:00.0649] I'm with the general idea of summarizing items, but pausing for a long duration feels like a bit much [09:17:09.0821] What is the point of blocking all other items while we committee a summary? [09:19:00.0306] I prefer doing this async as well [09:19:03.0565] we can do it more quickly if the presenters are a little more active about it. They can just dictate a quick summary and conclusion at the end of their topic [09:19:24.0141] yeah that's my preferred option [09:19:30.0395] we did that last meeting IIRC and it was efficient [09:19:33.0106] I think doing it sync especially for these smaller items is not the best idea [09:19:41.0770] for instance the last item was 4 minutes by itself [09:19:50.0343] and we spent over 5 minutes coming up with the summary [09:19:56.0908] last meeting I wrote many of the summaries. I want to get out of that pattern. [09:20:15.0891] the champion should just dictate a really quick summary and conclusion at the end of their topic. It should take less than one minute [09:20:24.0216] If the champion is not able to dictate it, then someone else can write it [09:20:41.0260] > <@littledan:matrix.org> last meeting I wrote many of the summaries. I want to get out of that pattern. that's fair, we shouldn't be burdening someone with them, but I think the presenter should just be able to summarize [09:20:53.0320] I can keep writing the summaries but I really don't trust that anyone is reviewing them and that concerns me. It risks making the notes biased. [09:21:04.0933] * I can keep writing the summaries but I don't know if anyone is reviewing them and that concerns me. It risks making the notes biased. [09:22:22.0485] heh, I wanted the main discussion points to be just part of the conclusion section but others disagreed hence we have two separate parts [09:22:42.0279] omg I just realised my camera was off that whole time lol, sorry [09:22:43.0675] littledan: how did you feel about that last one [09:22:49.0690] where someone just presented the summary [09:23:00.0436] and we can spend a few seconds to see if anyone wants to add to it [09:23:00.0929] yeah that was good. There was nothing to write in the summary; we just had a conclusion. [09:23:19.0667] In the future, I think a Stage 4 summary could list how the proposal meets Stage 4 requirements (e.g., where it's shipping, the fact that there are tests) [09:23:20.0983] > <@littledan:matrix.org> yeah that was good. There was nothing to write in the summary; we just had a conclusion. that's true, maybe not a great example [09:23:24.0347] but that's optional [09:23:31.0237] summary: proposal meets all stage 4 criteria [09:23:41.0248] anyway Kevin quickly dictating a conclusion is a good case [09:23:55.0396] > <@michaelficarra:matrix.org> summary: proposal meets all stage 4 criteria this is quite a bad summary since it leaves out the content; it might as well be omitted [09:24:16.0080] that's what the content was meant to provide evidence for [09:24:30.0581] summary: just take my word for it [09:25:19.0049] I'm looking forward to chatting with Samina about it in Bergen [09:25:59.0555] For discussion these short "summary" and "conclusion" are basically the same thing [09:26:16.0892] supporting evidence should be out-of-line [09:26:23.0671] notes aren't adversarial! [09:26:25.0904] OK yes this is fine [09:26:36.0829] i don't think someone is going to pull a fast one and then accidentally get something to stage 3+ [09:26:44.0297] we're just working on making the notes meaningful [09:26:50.0430] no one is adversarial about this [09:27:10.0090] it's fine to just have a conclusion and no summary for this kind of topic [09:27:19.0295] summaries are more important when we have a big debate and people make important points, IMO [09:32:42.0838] it's contextual -- sometimes the points make sense, sometimes it would be overkill. we'll get into a better rhythm with it, but just quickly getting it done when it's timely (at the end of the presentation) is the quickest and cleanest way to do it [09:39:03.0516] `toBase64String`/`toHexString`? [09:39:09.0890] seems like a stage 2 t hing [09:39:17.0938] * seems like a stage 2 thing [09:40:13.0871] Yah, definitely not blocking. I just like node's API [09:41:24.0867] to clarify, the streaming api is included in this in stage 2? [09:41:47.0623] ljharb: yep [09:41:48.0749] * to confirm, the streaming api is included in this in stage 2? [09:42:25.0537] The property names `more` and `extra` are a bit opaque, but I imagine anyone using the streaming API is going to likely need to refer to documentation anyways [09:42:46.0585] ✨extra✨ [09:42:56.0891] rbuckton: now that it's stage 2, it's the perfect time to suggest alternative names [09:43:38.0855] > <@michaelficarra:matrix.org> rbuckton: now that it's stage 2, it's the perfect time to suggest alternative names Agreed. I definitely support this for Stage 2 [09:46:04.0058] chairs: advance the queue? [09:46:11.0292] oh wait that's done nvm [09:47:46.0398] rbuckton: yeah, when we discussed base64 api in JSCIG meeting, it's hard for us to figure out the streaming api without check the full example in the proposal site [09:48:11.0422] I find Kevin's argument about it being better for developers if this is loud convincing [09:49:36.0893] (I didn't previously form an opinion about which semantics was better, just that the name needs to match) [09:49:41.0730] The downside of throwing is that something simple like `array.filter(Symbol.isWellKnown)` may now require an arrow to do a typeof test to avoid throwing. [09:50:19.0322] Is there any `isXXX` api in JS throws? [09:50:24.0117] I don't remember any [09:50:53.0453] BTW the summary for Shu's proposal is excellent [09:50:56.0432] By throwing, we're mandating forced overhead [09:51:51.0350] > <@rbuckton:matrix.org> The property names `more` and `extra` are a bit opaque, but I imagine anyone using the streaming API is going to likely need to refer to documentation anyways yeah I don't love the names, and would be happy to take new ones [09:52:30.0972] TextDecoder has `stream` which must be `false` for the last call, which confuses people a great deal, and I was trying to pick a name which avoids that problem (hence `more`) [09:52:44.0016] jschoi: it is a predicate and definitely would start with "is" [09:53:19.0154] `streamMore` [09:53:30.0248] ugh [09:54:10.0692] I could imagine `last` instead of `more`? and you set `last: true` on the last call? [09:54:42.0251] > <@bakkot:matrix.org> TextDecoder has `stream` which must be `false` for the last call, which confuses people a great deal, and I was trying to pick a name which avoids that problem (hence `more`) I'm having a hard time conceptualizing what `more` actually does, from just reading the spec. It seems like it means "if `true`, also return any unencoded bytes as a new array". would that be a correct interpretation? [09:55:19.0961] the exact opposite: if `false` return any unencoded bytes as a new array; if `true` then encode all bytes including any padding if necessary [09:55:37.0436] i.e., it indicates whether more input is expected [09:55:44.0031] `crossRealmObj[Symbol.iterator]()` needs to use a well-known symbol [09:55:44.0779] wait [09:55:50.0657] * the exact opposite: if `true` return any unencoded bytes as a new array; if `false` then encode all bytes including any padding if necessary [09:55:55.0526] yes the thing you said [09:56:01.0015] I was thinking of the inverted one I just described [09:56:06.0522] * ~~the exact opposite: if `true` return any unencoded bytes as a new array; if `false` then encode all bytes including any padding if necessary~~ [09:56:14.0700] * ~the exact opposite: if `true` return any unencoded bytes as a new array; if `false` then encode all bytes including any padding if necessary~ [09:56:22.0839] * [ugh matrix does not have strikethrough] [09:57:32.0288] the important part is, if `more` is `false` then all bytes get encoded, including any padding if necessary [09:57:35.0725] Michael Ficarra: so like, for iframes? [09:57:48.0877] > <@bakkot:matrix.org> [ugh matrix does not have strikethrough] it does? [09:57:57.0731] how [09:58:03.0576] shu: yep [09:58:08.0208] it's cursed actually [09:58:22.0965] you need to surround it with `` tags [09:58:29.0800] _what_ [09:58:37.0609] While I know choosing a single-word property might generally be preferrable, I think the underlying semantics are complex enough that a more descriptive name might be advisable, like `excludeOverflow` or something. [09:58:47.0505] "the following text has been struck: " [09:58:50.0136] ikr [09:58:55.0491] Michael Ficarra: do you think that rises to the level of needing a predicate in the language? [09:59:05.0896] `this` [09:59:31.0712] I don't actually like the name `excludeOverflow`, tbh, just using it as an example. [09:59:36.0914] shu: eh, barely [10:00:01.0730] rbuckton: yeah, seems reasonable (in general, I also don't like that particular name) [10:00:24.0038] like, what is the thing you're writing other than polyfills that can benefit from this (and i still contend this adds major pain point to polyfills, but the counterargument there seems to be "we'll just ignore patching it when polyfilling because that's not realistic anyway) [10:00:51.0047] the sum of "what'll happen in practice" conclusions here leaves me mostly unhappy [10:00:59.0423] `extra` is more annoying because you need to shuttle it between calls - the value returned from one call gets passed into the next. so I wanted a name which could make sense in both positions, and that's tricky. [10:01:18.0355] * `extra` is more annoying because you need to shuttle it between calls - the value returned from one call gets passed into the next. so I wanted a name which could make sense in both positions (so you can use destructuring and the property shorthand), and that's tricky. [10:01:59.0103] * like, what is the thing you're writing other than polyfills that can benefit from this (and i still contend this adds major pain point to polyfills, but the counterargument there seems to be "we'll just ignore patching it when polyfilling because that's not realistic anyway") [10:04:08.0943] I understand why you might not want to use `TextEncoder` directly, but is there a reason a similar API wouldn't be sufficient? Similar APIs in other languages usually have the number of bytes read or written as part of the result, leaving it up to the user to do any byte shuffling when streaming. [10:04:37.0906] a similar API would be sufficient, but much heavier - I'd really prefer to avoid adding an entirely new class to the language for this [10:05:40.0960] I'm not saying you should add a new class. I'm just talking about the use of read/written counts for decode/encode instead, much like `TextEncoder`/`TextDecoder` do. [10:05:56.0467] Are we talking about the same `TextEncoder`? [10:06:11.0243] The one in HTML doesn't have a byte count afaik [10:06:15.0290] Let me piece together an example [10:06:40.0181] https://developer.mozilla.org/en-US/docs/Web/API/TextEncoder/encodeInto has `read`/`written` [10:07:07.0201] ah, I was thinking of `encode`, yeah [10:07:58.0731] > <@bakkot:matrix.org> a similar API would be sufficient, but much heavier - I'd really prefer to avoid adding an entirely new class to the language for this There's no actual state stored in `TextEncoder`, `encode` and `encodeInto` could very well be static methods [10:08:13.0994] Andreu Botella: Yeah I mean TextDecoder [10:08:39.0687] encoder is trivial but decoder has to handle surrogate pairs when streaming, so it needs to keep state [10:08:54.0411] shu: https://github.com/tc39/proposal-symbol-predicates/issues/12 [10:09:16.0810] ljharb: excellent, thanks [10:09:31.0608] and you have the same issue with base64, where you need to encode 3 bytes at a time, and if your chunks are not == 0 mod 3 you need state [10:16:44.0917] shu: https://github.com/tc39/proposal-arraybuffer-base64/issues/21 [10:25:23.0099] bakkot: ```js // parameters: // start - optional offset into `bytes` at which to start encoding // (default: `0`, replaces `extra`) // count - optional number of bytes to read from `bytes` (default: // the length of the array minus `start`) // final - whether this is the final block to encode, e.g. overflow // bytes are truncated (replaces `more`, though has the // opposite meaning. could also be `done`) // return value: // result - encoded text chunk // read - number of bytes read from `bytes` (replaces `extra`) const { result, read } = bytes.toPartialBase64({ start, final }); ``` This could be used in tandem with `copyWithin` to use a fixed-size buffer to encode incoming streaming data, rather than allocating new `Uint8Array` objects to hold onto the overflow. [10:28:47.0327] I'm not sure if your proposal was just creating a new u8 array view over the underlying array buffer to hold onto the overflow, or if it was creating a brand new array buffer (the spec steps say "TODO" here, so its unclear). If its the former, that would make it difficult to use a fixed-size buffer as a work area (which is fairly common when encoding/decoding a stream), since you could potentially overwrite the overflow in between calls. If its the latter, then you're introducing a lot of overhead for a stream with all of the one or two-byte arrays you might generate. [10:30:37.0664] Proposal was an entirely new buffer. I figured that the overhead of making some new small arraybuffers wasn't actually worth worrying about, unless implementers say otherwise. [10:31:17.0839] In principle it should be any more overhead than making any other object, I would think. [10:37:36.0935] That's where having an actual encoder class might be even more efficient, since you wouldn't be allocating all of these nursery objects for the options bag and return value. [10:40:58.0117] but barring a class or something like `ref` parameters to avoid the potential nursery object allocations, an api that works with offsets/counts seems more efficient (by avoiding the extra arrays) and user-friendly (by avoiding hidden overwrite conflicts). [10:43:11.0362] with the offset/count design, how do users handle the extra bytes, in the case that they have e.g. two chunks (in different Uint8Arrays) where the first chunk has a length which is not a multiple of 3? [10:43:38.0012] concretely, let's say the first chunk is 10 bytes, and the second chunk is 4 bytes [10:44:36.0592] In pretty much every other language, they copy from one array into the other, or copy both into a fixed-size buffer (which your spec steps also do) [10:44:57.0234] the spec steps are fictional; no reason an actual implementation would work that way [10:45:13.0663] the buffers aren't growable so you can't copy from one into the other [10:45:20.0899] The code a user would have to write would be fairly similar to other languages, which is familiar. [10:45:32.0584] asking to copy into a new array seems like a big ask [10:45:45.0368] > <@bakkot:matrix.org> the buffers aren't growable so you can't copy from one into the other You can if one buffer has a fixed size, and you're using counts. [10:46:03.0708] ... how? [10:46:07.0830] > <@bakkot:matrix.org> asking to copy into a new array seems like a big ask A big ask of who? This is usually how its done when you're at a low level like this. [10:46:48.0714] by "a big ask" I mean "that does not seem like it is a more ergonomic API than the current proposal" [10:47:23.0280] I am in general amenable to arguments of the form "we should do it like other languages", but in this particular case I'm not convinced, at the moment [10:47:38.0988] > <@bakkot:matrix.org> by "a big ask" I mean "that does not seem like it is a more ergonomic API than the current proposal" It may not be, but its no less ergonomic than the same low-level API in other languages. [10:48:02.0555] If you want something more ergonomic, I'd advise a class that can maintain the state. [10:48:30.0381] I think the design in the proposal is more ergonomic than this design, and does not require a class to maintain the state [10:48:36.0395] so I like it best of the options discussed so far [10:48:54.0914] possibly there is some tweak to your design which allows you to avoid the copy, which is my main objection to it [10:49:04.0856] My argument is that the current design is not friendly to memory or GC. [10:49:12.0871] I am still missing the claim about, how do you copy from one buffer into the other [10:49:24.0060] Except that your design also performs copies, but they're out of the user's control [10:49:32.0371] My design doesn't perform copies [10:49:38.0134] The spec steps do but they are fictional [10:50:06.0601] If implementations object on the grounds of creating new objects I'd hear them out, but I'd want to hear that from them - generally speaking we create new objects all of the place and don't worry too much about it [10:50:19.0323] concretely I would be reluctant to sacrifice the design if the _only_ concern is the new objects [10:50:30.0642] No, not if you're returning a fresh array that is 0-2 bytes for the overflow. Its small, but its a copy. [10:50:39.0856] sure, yes, I am creating a copy of 0-2 bytes [10:50:42.0858] not of an entire chunk [10:50:51.0002] > <@bakkot:matrix.org> If implementations object on the grounds of creating new objects I'd hear them out, but I'd want to hear that from them - generally speaking we create new objects all of the place and don't worry too much about it well, you just heard an implementation request BYOB for streaming--I think that's the main "allow avoiding create new objects" request to worry about [10:51:15.0862] littledan: the BYOB thing isn't really related to this conversation afaict [10:51:33.0495] err sorry I'm sort of agreeing with you [10:51:43.0274] ah, gotcha [10:53:11.0263] The way you would normally do this in C++ or C# would be to have a working buffer. You block-copy bytes from your incoming chunk into the working buffer, and use offset/count to control where to read/write from. If there is overflow, you block-copy the overflow bytes to the start of the temp buffer, and the next chunk would be written after those bytes. [10:54:27.0614] Typed arrays have two copying mechanisms: `copyWithin` and `set` (though I'm not sure if they are block-copy operations when compiled/optimized). [10:54:49.0744] The way you work with binary data in C++ in general is sufficiently far from JS that I am not willing to trust that this will be familiar to JS developers [10:55:35.0026] and if your concern with the design in the proposal is memory, having something which requires manual management and copying with an additional working buffer seems like it is worse for memory concerns [10:56:12.0046] This capability seems somewhat niche enough that the Venn diagram of entry-level JS devs and calls to `toPartialBase64` seems fairly small. [10:56:46.0628] Even non entry-level JS devs are not necessarily going to have written a bunch of C++. [10:57:26.0312] > <@bakkot:matrix.org> and if your concern with the design in the proposal is memory, having something which requires manual management and copying with an additional working buffer seems like it is worse for memory concerns Perhaps this might be a question for implementers, since this seems exactly like how the current spec text might be implemented at runtime. [10:58:19.0337] I mean if they want to implement that way that's certainly their prerogative [10:58:32.0986] and if they aren't worried about the memory involved I'm not either [10:58:37.0362] I don't want to worry about it for them [10:58:50.0603] if they _are_ worried about the memory it's easy to write in such a way that the copy of the full chunk is avoided [11:00:17.0034] > <@rbuckton:matrix.org> Perhaps this might be a question for implementers, since this seems exactly like how the current spec text might be implemented at runtime. There is truth to this: implementations often start out by literally copying the spec. So if there's a way to write the spec which demonstrates the optimization more straightforwardly, that'd probably result in faster initial implementations. [11:00:31.0500] (as long as it doesn't look too obscure) [11:01:01.0057] I wrote it that way originally but it does end up looking pretty obscure [11:01:22.0181] I can add a NOTE pointing out the opportunity for optimization [11:01:38.0814] Saying "the spec text is fictional" isn't a useful argument, IMO. This is working with memory in a way that the actual implementation that engines will end up using would have a significant bearing on the API design. If there are concerns about memory/GC efficiency of an actual implementation, that seems like useful information to consider before Stage 3. [11:02:53.0825] I agree that if engines say they don't like this design because of GC concerns then we'd want to reconsider. I just don't see it right now. And the _internal_ copy, if they choose to implement spec steps blindly, doesn't interact with GC at all. [11:07:09.0996] Your proposal, however, observably creates new arrays for the overflow bytes, which will need to be GC'd. [11:08:29.0122] Yes, I agree it creates two small objects rather than only one, and as I say if engines don't like that because of GC concerns then we'd want to reconsider [11:09:06.0437] The current design does rest on the assumption that "creates two small objects" is not a big problem [11:09:16.0031] * The current design does rest on the assumption that "creates two small objects per chunk" is not a big problem [11:09:46.0289] (three, really, since the user needs to create one to pass in as an options bag) [11:15:00.0008] This seems like the kind of API where you're _going_ to use it in a loop (i.e., encoding/decoding files in a resource-constrained environment), so ideally we'd have as few objects as possible per iteration (i.e., use multiple arguments rather than an option bag), unless implementations can optimize away the options bag at runtime. [11:15:30.0883] Though the options bag can be made efficient if you just reuse the same object for each iteration. [11:17:10.0770] I worked out the current design in conjunction with Peter from moddable; if they're not worried about it, I'm not either. I'm not going to sacrifice the UX for concerns about devices which are more resources constrained than them. [11:17:25.0500] * I worked out the current design in conjunction with Peter from moddable; if they're not worried about it, I'm not either. I'm not going to sacrifice the UX for concerns about devices which are more resource constrained than them. [11:18:22.0629] It is definitely true that using multiple arguments rather than an options bag would use fewer objects; I just don't think it's worth it. [11:19:34.0946] Similarly it is true that we could do a C++ style design where users are expected to manage copies into a working buffer themselves, and thereby create one fewer object; I just don't think it's worth the cost to the UX (and am not convinced that having this extra buffer would in fact be better for memory, even though it would be fewer total objects). [11:26:58.0416] This design is halfway between efficient and ergonomic. One that works on offsets would be far more efficient, but far less ergonomic. One that utilized a class to encapsulate scope could be both extremely efficient and far more ergonomic, so I'm not very convinced of the argument that the UX benefit of the proposed design is worth the efficiency loss. [11:29:14.0477] I don't think "creates one fewer object per chunk" can reasonably be characterized as "far more efficient". [11:29:31.0329] It is _very marginally_ more efficient, at the cost of a much worse experience. [11:30:47.0413] (And I'm not even convinced it would be more efficient in practice, since it requires the user to manage an additional working buffer.) [11:33:40.0229] +1 to Nicolo's answer [11:49:29.0951] I have a question about "attach context" and "link", these two phase seems do not need to be in specific order? I mean currently is is designed to first attach context then link, but could first link then attach context also work? [11:50:53.0248] > <@haxjs:matrix.org> I have a question about "attach context" and "link", these two phase seems do not need to be in specific order? I mean currently is is designed to first attach context then link, but could first link then attach context also work? "context" includes the "resolution context", i.e. instructions on how to load/resolve the dependencies. But yes, "attach the globalThis context" could potentially happen after linking [11:53:25.0477] oh, i see, thank u! [12:00:50.0329] Is TCQ down? [12:00:56.0204] I get an internal server error [12:01:14.0342] no [12:01:20.0025] It is fine here [12:01:25.0961] Seems good to me [12:01:28.0938] Uh ok it works on a different device [12:03:25.0141] > <@rbuckton:matrix.org> This design is halfway between efficient and ergonomic. One that works on offsets would be far more efficient, but far less ergonomic. One that utilized a class to encapsulate scope could be both extremely efficient and far more ergonomic, so I'm not very convinced of the argument that the UX benefit of the proposed design is worth the efficiency loss. Can you show an example API? I weakly preferred a stateful class instead of the objects myself in [#13](https://github.com/tc39/proposal-arraybuffer-base64/issues/13) [12:03:45.0257] > <@jridgewell:matrix.org> Can you show an example API? I weakly preferred a stateful class instead of the objects myself in [#13](https://github.com/tc39/proposal-arraybuffer-base64/issues/13) An example of a class-like API? [12:04:32.0976] wait what is "attach context" again? [12:04:51.0213] Yah, how would you use it and how is it more efficient than the current API? [12:05:19.0542] > <@shuyuguo:matrix.org> wait what is "attach context" again? The module's base URL, and something else [12:05:43.0748] > <@shuyuguo:matrix.org> wait what is "attach context" again? This is attaching the global variable, and yes the current URL [12:05:57.0365] for context, one of the compartments proposals was about user-supplied globals [12:06:22.0713] module expressions don't have their global attached yet [12:06:28.0221] > <@shuyuguo:matrix.org> wait what is "attach context" again? * This is attaching the global variable\ [12:06:54.0226] i see [12:07:25.0468] thanks [12:07:40.0953] https://docs.google.com/presentation/d/1mZrAHHimtM_z_8fM9L3DUXFz5bjlJPxx8VrwsC68hmk/edit#slide=id.g23e5197d83a_1_38 [12:07:57.0872] module expressions do *not* have a global variable attached yet, for example (but they do have a base URL) [12:08:27.0464] or at least, module source doesn't... actually module expressions might have them attached and it just gets discarded during structured clone [12:08:53.0349] (sorry ignore me here I got confused; nicolo-ribaudo can clarify better) [12:10:37.0993] Module expressions inherit the global object / realm from where the module expression is evaluated, but when structuredCloning them the idea is that the unserializable parts (such as, the global context) would be re-attached when deserializing them [12:11:53.0213] The "context" is currently attached when creating a Module Record (i.e. in ParseModule) that receives the _realm_ and _hostDefined_ params (where hostDefined includes the baseURL) [12:12:02.0021] * The "context" is currently attached when creating a Module Record (i.e. in ParseModule) that receives the _realm_ and _hostDefined_ params (where hostDefined includes the baseURL when used in HTML) [12:12:13.0329] when will it be structurecloned? send to a worker? [12:13:02.0766] Or `structuredClone(module {})`, or `v8.deserialize`/`v8.serialize` in Node.js [12:13:08.0877] * Yes, or `structuredClone(module {})`, or `v8.deserialize`/`v8.serialize` in Node.js [12:13:25.0079] * Yes, or `structuredClone(aModuleObject)`, or `v8.deserialize`/`v8.serialize` in Node.js [12:13:39.0571] So can i also structureclone module declaration? [12:13:50.0005] anyway module source objects do not have context attached [12:14:45.0880] > <@haxjs:matrix.org> So can i also structureclone module declaration? Yes, with a very big note that we currently don't have written down exactly how that works with module declarations importing module declarations (there have been concerns about the "scope capturing" between module declarations, so before proposing details for the HTML integration we want to solve the most fundamental concerns) [12:15:03.0960] It seems like it would have to be a host hook requirement that there's no module source for JS imports, right? [12:15:37.0253] > <@abotella:igalia.com> It seems like it would have to be a host hook requirement that there's no module source for JS imports, right? Well JavaScript Module Records are created within ECMA-262 (by the ParseModule AO), so the proposal directly encorces it [12:15:59.0094] > <@abotella:igalia.com> It seems like it would have to be a host hook requirement that there's no module source for JS imports, right? Concretely the throwing behavior is inherited from Cyclic Module Records [12:16:37.0143] https://tc39.es/proposal-import-reflection/#sec-getmodulesource [12:16:54.0561] ljharb: I see where you're coming from, but IMO that would just add noise [12:16:56.0105] > <@littledan:matrix.org> Concretely the throwing behavior is inherited from Cyclic Module Records (maybe it would make sense to move it to Source Text Module Record, since Wasm modules also are cyclic module records in the Wasm-ESM integration) [12:17:15.0036] > <@michaelficarra:matrix.org> ljharb: I see where you're coming from, but IMO that would just add noise it indeed would add noide [12:17:16.0447] > <@michaelficarra:matrix.org> ljharb: I see where you're coming from, but IMO that would just add noise * it indeed would add noise [12:17:30.0963] > <@nicolo-ribaudo:matrix.org> (maybe it would make sense to move it to Source Text Module Record, since Wasm modules also are cyclic module records in the Wasm-ESM integration) well, arguably we should move this even further up, since it will apply to static module records as well [12:24:24.0114] i am not understanding the alternative ron is proposing [12:29:34.0904] > <@shuyuguo:matrix.org> i am not understanding the alternative ron is proposing me neither; maybe we should pause to clarify this? [12:30:02.0323] I got the feeling he was suggesting that we only have the dynamic case, and use `import.source(x)` for that. Or maybe even just a function call. [12:30:07.0256] +1 let's get to other queue items if ron's particular alternative isn't actually on the table [12:30:15.0581] instead of getting in the weeds for a vague alternative [12:30:23.0014] but the current clarification sounds good [12:31:46.0364] oh! this is a completely different alternative: that we use `with` for all of these instead [12:32:07.0142] okay then we should pause to clarify [12:34:45.0959] Chris de Almeida: do we have time to overrun the timebox? [12:34:55.0534] yes [12:35:09.0254] we can go through the end of the hour [12:35:10.0090] you can run upto the top of the hour [12:35:35.0431] still need to be mindful of the queue [12:42:26.0193] I've argued a few times that phase could be in the import attributes. Memo caching can be solved, early errors can be supported. [12:43:00.0517] My reasoning is that phase is conceptually similar to an evaluator, meaning it changes the source text of the thing it imports (and this is how it's going to be implemented in bundlers) [12:43:13.0310] Evaluators go in the import attributes bag. [12:43:25.0630] import attributes isn't exactly "evaluators" tho. [12:44:42.0172] * import attributes isn't exactly "evaluators" tho - they can do that but that's not the purpose of them [12:46:07.0295] I have a weak preference against `import ` for the static syntax. I have a stronger preference for `import.()` for the dynamic syntax as the `import(url, { phase })` syntax either introduces unnecessary asynchrony for asset references, or it introduces a non-promise return value from `import` (for asset references). The `import(url, { phase })` syntax also introduces complexity for future proposals that may need to somehow navigate `phase` and `with` attributes on the object. [12:46:09.0310] module from {} import source from from [12:47:02.0828] > <@jridgewell:matrix.org> My reasoning is that phase is conceptually similar to an evaluator, meaning it changes the source text of the thing it imports (and this is how it's going to be implemented in bundlers) The intersection semantics with importHook would be quite bad in that case. The importHook is responsible for returning a Module irrespective of the phase, and the importHook will need to see the whole options bag, and the importHook is memoized according to the specifier + all attributes. You will get duplicate instances if you import with multiple phases. [12:47:52.0584] I don't really understand the syntax brittleness argument, all syntax is brittle to some degree [12:48:19.0451] we don't have like syntax checksums or ECC for syntax [12:48:54.0197] I think you're relying on the engine to do the memoization, instead of letting the `importHook`? [12:49:40.0379] > <@kriskowal:matrix.org> The intersection semantics with importHook would be quite bad in that case. The importHook is responsible for returning a Module irrespective of the phase, and the importHook will need to see the whole options bag, and the importHook is memoized according to the specifier + all attributes. You will get duplicate instances if you import with multiple phases. The only way this could work is to "hide" the phase attribute and not pass it to the importHook even if it's specified [12:49:42.0616] The `Module` instance is relied upon to do the memoization, yes. [12:50:32.0732] if everything was S-expressions, I guess it would be less brittle, but also it would look like (()()()))()()()()(())())()()())))()()((()((()) [12:50:36.0421] > <@rbuckton:matrix.org> I have a weak preference against `import ` for the static syntax. > I have a stronger preference for `import.()` for the dynamic syntax as the `import(url, { phase })` syntax either introduces unnecessary asynchrony for asset references, or it introduces a non-promise return value from `import` (for asset references). The `import(url, { phase })` syntax also introduces complexity for future proposals that may need to somehow navigate `phase` and `with` attributes on the object. I can understand this argument, but also it seems really specific to asset references, which we really haven't worked out yet. [12:50:42.0468] Its somewhat odd that we can `import asset ...` to resolve a url, and `import source ...` to fetch AND compile, but no way to just fetch via syntax. [12:51:01.0509] > <@nicolo-ribaudo:matrix.org> The only way this could work is to "hide" the phase attribute and not pass it to the importHook even if it's specified The `importHook`'s memo can handle that case pretty easily? [12:51:21.0750] > <@michaelficarra:matrix.org> if everything was S-expressions, I guess it would be less brittle, but also it would look like (()()()))()()()()(())())()()())))()()((()((()) Is uglily-js still used? [12:51:26.0746] > <@littledan:matrix.org> I can understand this argument, but also it seems really specific to asset references, which we really haven't worked out yet. I'm not a fan of turning `import` into an RPC call, i.e., specifying the operation via a property in an object as opposed to an imperative call. [12:51:34.0580] * module from {} import source from from "url" [12:51:54.0420] > <@rbuckton:matrix.org> Its somewhat odd that we can `import asset ...` to resolve a url, and `import source ...` to fetch AND compile, but no way to just fetch via syntax. Environments might add that through import attributes, but at the same time it's a little risky since you could never GC such a fetch result [12:52:03.0444] It feels akin to asking someone to write `array.do({ action: "filter", callback: fn })` [12:52:12.0724] > <@jridgewell:matrix.org> The `importHook`'s memo can handle that case pretty easily? You wouldn't want an user-defined hook to potentially load a different module depending on the specified phase [12:52:40.0109] > <@rbuckton:matrix.org> It feels akin to asking someone to write `array.do({ action: "filter", callback: fn })` it sounds like you're arguing against import assertions then? [12:52:51.0117] > <@rbuckton:matrix.org> It feels akin to asking someone to write `array.do({ action: "filter", callback: fn })` * it sounds like you're arguing against import attributes then? [12:53:06.0453] > <@haxjs:matrix.org> module from {} > import source from from > "url" is this case cause syntax ambiguity ? [12:53:13.0443] That's the responsibility of the code import hook code. If you use a power-use feature, you're expected to follow the rules [12:53:21.0555] why do SES folks have the time to burden every proposal with this requirement but they don't have the time to work on the `getIntrinsics` proposal or whatever it is? [12:53:23.0256] > <@littledan:matrix.org> it sounds like you're arguing against import attributes then? No, import attributes are a bit more esoteric. This is far more obviously an operation [12:53:48.0643] > <@haxjs:matrix.org> is this case cause syntax ambiguity ? Yeah, I think `from` should be banned in all these cases; it's good that you and Waldemar are pointing this out [12:54:39.0953] > <@haxjs:matrix.org> is this case cause syntax ambiguity ? Yes this is probably what WH was worried about. It can be specced as unambiguous (and in parser it's a two tokens lookahead, or just "eat three identifiers and then decide if they are bindings or syntax"). It would still "read" as unambiguous, but how often would you import a `source` binding from a module declaration named `from`? (how many files do you have called `from.js`?) [12:54:43.0976] > <@rbuckton:matrix.org> No, import attributes are a bit more esoteric. This is far more obviously an operation oh, I see, we're back on `import.stage()` and not talking about the put-it-all-in-attributes side (which would be fine with phase:) [12:54:47.0062] > <@haxjs:matrix.org> is this case cause syntax ambiguity ? * Yes this is probably what WH was worried about. It can be specced as unambiguous (and in parser it's a two tokens lookahead, or just "eat three identifiers and then decide if they are bindings or syntax"). It would still "read" as unambiguous, but how often would you import a `source` binding from a module declaration named `from`? (how many files do you currently have called `from.js`?) [12:54:57.0424] * Yes this is probably what WH was worried about. It can be specced as unambiguous (and in parser it's a two tokens lookahead, or just "eat three identifiers and then decide if they are bindings or syntax"). It would still "read" as ambiguous, but how often would you import a `source` binding from a module declaration named `from`? (how many files do you currently have called `from.js`?) [12:55:17.0575] * Yes this is probably what WH was worried about. It can be specced as unambiguous (and in parser it's a two tokens lookahead, or just "eat three identifiers and then decide if they are bindings or syntax"). It would still "read" as ambiguous, but how often would you import a `source` binding from a module declaration named `from`? (how many files do currently exist have called `from.js` that export a `source` variable?) [12:55:38.0955] > <@littledan:matrix.org> oh, I see, we're back on `import.stage()` and not talking about the put-it-all-in-attributes side (which would be fine with phase:) Yes. I also brought up the cache-key concern internally, though the same argument was made that "such attributes don't need to be made part of the cache key" [12:56:00.0401] > <@nicolo-ribaudo:matrix.org> Yes this is probably what WH was worried about. It can be specced as unambiguous (and in parser it's a two tokens lookahead, or just "eat three identifiers and then decide if they are bindings or syntax"). > It would still "read" as ambiguous, but how often would you import a `source` binding from a module declaration named `from`? (how many files do currently exist have called `from.js` that export a `source` variable?) I don't worry about it in real world. Just try to find the edge case for parsers. [12:56:12.0051] > <@rbuckton:matrix.org> Yes. I also brought up the cache-key concern internally, though the same argument was made that "such attributes don't need to be made part of the cache key" yes I think this argument is valid--it just provides a guarantee; it wasn't impossible to meet otherwise [13:00:57.0895] I also prefer `import.phase()` for similar reason. [13:02:30.0254] people don't mean literally `import.phase`, right? you mean `import.source()`? [13:02:47.0079] I am ok with `import `, prefer `import.()` for dynamic unless there are strong objections. It seems like the champions had "no preference" when discussing it in slides. [13:03:13.0271] > <@michaelficarra:matrix.org> people don't mean literally `import.phase`, right? you mean `import.source()`? Yes. `import.()` is what I'd tried to use earlier in chat. [13:04:38.0737] > <@michaelficarra:matrix.org> why do SES folks have the time to burden every proposal with this requirement but they don't have the time to work on the `getIntrinsics` proposal or whatever it is? fwiw i am working on it, and expect to bring it to the july plenary [13:05:20.0923] please let's not do conditional advancement [13:05:53.0891] I'm sorry, I missed part of the conversation because my power cut out, but I do not want to do conditional advancement [13:06:11.0920] Agree with shu , I don't like such big syntax decision (not like simple case `await using` or `using await`) be conditional stage 3. [13:06:13.0020] we might have time at the end of the meeting anyway [13:06:19.0554] we could just come back to it [13:06:29.0913] we should not rush stuff [13:06:41.0481] > <@michaelficarra:matrix.org> I'm sorry, I missed part of the conversation because my power cut out, but I do not want to do conditional advancement Do you want this in the notes? [13:06:59.0037] nicolo-ribaudo: no it's fine [13:07:21.0744] sorry I'm also very happy to wait until the end of the meeting or a future meeting and not rush stuff [13:07:26.0185] though I do think that, syntax-wise, this is actually easier than `using await`/`await using` since the technical aspects of grammar work out easier. [13:08:16.0637] littledan: conditional stage 3 might need to be renamed then. i think it's most useful as a "we have decided here are the set of things we don't want reopen discussion on", and in the past it's been mostly smallish things like a name or something, so it's also coincided with "let's start implementing it just like other stage 3 proposals" [13:09:09.0303] Yeah anyway I sort of retract my comment [13:09:36.0747] I don't think we've been using conditional stage 3 that way though [13:09:43.0977] hmm [13:09:50.0771] but I've been surprised by the breadth of usage of conditional stage 3 and I'm happy to use less of it [13:10:12.0449] yes, that's probably closer to the root of my unease [13:10:14.0497] the "conditional" aspect is just supposed to save us the two months of waiting for a perfunctory, meaningless signify to something we've already agreed on [13:10:15.0853] I also don't support "conditional" stage N, where N is ≥ 2. We have time during this meeting for the champions to come back with the dynamic import.phase() change discussed. [13:10:37.0525] if we want to piecemeal decide "this topic is now closed and we have consensus", we should do that. i for one would like that [13:10:54.0263] I do wish we made more use of "consensus for this thing not being open for further discussion" outside of specific stage questions [13:11:31.0000] *i*'ve been thinking of conditional stage 3 as like, look, here're a few small things that a small set of stakeholders care about for small N, settle that async, i'll reload the issue in a month when i or someone on the team implement the feature [13:11:37.0001] I know I'm guilty of using conditional advancement, but I've generally tried to keep it to small things that we usually have consensus on, but require some additional leg work outside of plenary to resolve. [13:11:42.0870] > <@msaboff:matrix.org> I also don't support "conditional" stage N, where N is ≥ 2. We have time during this meeting for the champions to come back with the dynamic import.phase() change discussed. heh, conditional Stage 1 doesn't end up being so meaningful, we can just grant something Stage 1 and trust that a person will come back to it [13:11:49.0909] lol, sick [13:11:52.0200] if we had conditional stage 1 [13:11:56.0056] * I know I'm guilty of using conditional advancement, but I've generally tried to keep it to small things that we usually have consensus on (or are close to consensus on), but require some additional leg work outside of plenary to resolve. [13:12:45.0573] > <@shuyuguo:matrix.org> *i*'ve been thinking of conditional stage 3 as like, look, here're a few small things that a small set of stakeholders care about for small N, settle that async, i'll reload the issue in a month when i or someone on the team implement the feature In theory, the point in time when something actually moves to the next stage should be when you should reload (but we don't have an easy way to trigger on that) [13:13:15.0658] I suspect some of this would depend what we are conditional on. e.g. conditional on a spec review by XYZ is different than conditional on a syntax or semantic change. [13:13:16.0968] anyway I think a good rule of thumb could be, "if it's controversial whether conditionality could be used here, it's probably not time yet" [13:15:52.0796] > <@bakkot:matrix.org> I do wish we made more use of "consensus for this thing not being open for further discussion" outside of specific stage questions This is a good idea. We can rephrase it as this when we resume the queue later in the meeting. We ask for consensus on everything except: - dynamic import syntax - `import source from ...` ambiguity We can then come back next meeting (97th) to actually advance. We'd stay at stage 2 for now. I also don't want to make conditionallity overly complex. If we have locked in the semantics for everything except those two, we can doing some preparatory implementation work already under the assumption that we will go to stage 3 next meeting. [13:21:54.0551] guybedford, Luca Casonato: apologies this concern didn't come up earlier in stage 2. My preference for `import.()` is stronger than the "no preference" described by the champions, but not a deal breaker. If no one else strongly prefers that syntax, I certainly won't block advancement. [13:22:29.0020] Does module declaration allow: module x {} import x; ? [13:22:35.0173] yes [13:23:35.0836] > <@rbuckton:matrix.org> guybedford, Luca Casonato: apologies this concern didn't come up earlier in stage 2. My preference for `import.()` is stronger than the "no preference" described by the champions, but not a deal breaker. If no one else strongly prefers that syntax, I certainly won't block advancement. no worries - i think your strong preference outweighs the "no to very light preference" from others here, so we can make the change for next meeting [13:24:08.0676] If allow, i guess parser need to read many token in the case like: module source {} import source x from "url" [13:24:29.0693] > <@lucacasonato:matrix.org> no worries - i think your strong preference outweighs the "no to very light preference" from others here, so we can make the change for next meeting and kris's brief argument that this could be used to grant the capability of importing sources, but not evaluating (ie providing inspection but not evaluation), purely through syntax seems good in general [13:24:58.0170] > <@haxjs:matrix.org> If allow, i guess parser need to read many token in the case like: > module source {} > import source > x > from > "url" no, because `import source "specifier"` is not valid [13:25:09.0805] unless I am misunderstanding what you mean [13:25:38.0473] oh i see what you mean now - ok good catch [13:26:33.0302] could we avoid this by banning module declarations that have import phases as names? [13:27:39.0723] ban all phase names like source/instance/asset/defer ...? [13:28:35.0274] or actually even easier, just ban `import ;` [13:28:56.0452] HE Shi-Jun I'm curious, do you get these case by experience working on a JS parser? I would love to borrow some tests for Babel 👀 [13:29:12.0847] * HE Shi-Jun I'm curious, do you get these cases by experience working on a JS parser? I would love to borrow some tests for Babel 👀 [13:30:19.0911] > <@nicolo-ribaudo:matrix.org> HE Shi-Jun I'm curious, do you get these cases by experience working on a JS parser? I would love to borrow some tests for Babel 👀 just follow previous discussed `import source from from`, someone in my wechat group asked the question. [13:31:21.0623] > <@lucacasonato:matrix.org> or actually even easier, just ban `import ;` We must make sure we will not introduce new phase in the future :) [13:35:38.0258] I will try to implement module declarations (at least the part for `import`) in Babel's to have a clearly understanding of hard it is to disambiguate. Currently we implement only an old syntax of import reflection (`import module foo from "foo") without implementing also module declarations, and disambiguating `import module from from "x"` vs `import module from "x"` requires a 1-token lookahead. Another way to disambiguate is to keep eating identifiers until they represent possible valid syntax and then disambiguate based on the number of identifiers parser (and discard 0 to 2 "identifier" nodes created in the process) [13:37:42.0504] > <@haxjs:matrix.org> If allow, i guess parser need to read many token in the case like: > module source {} > import source > x > from > "url" HE Shi-Jun: i think maybe the easiest possible fix is to disallow newlines between phase and identifier? [13:51:55.0721] `Source Phase Imports for Stage 3 (cont’d from Day 1)` has been added to the schedule as the final item tomorrow [13:52:22.0093] limited to 20 minutes [13:52:30.0829] What was the public calendar topic conclusion? [13:52:39.0912] no conclusion is recorded in the notes. Are we going ahead with anything? [13:52:40.0897] I was going to update that [13:52:56.0782] In general, a lot of the notes need significant edits and are incoherent [13:53:08.0010] * I ~~was~~ am going to update that [13:53:29.0507] (pro tip: use ``) [13:53:50.0117] also in general, we can delete comments in the notes that are just queue management, right? [13:53:56.0879] yes [13:54:25.0333] at least, I always do when I'm editing [13:54:47.0359] shu: re byo-buffer, thoughts on https://github.com/tc39/proposal-arraybuffer-base64/issues/21#issuecomment-1548418530? [13:55:19.0987] also: you know TextEncoder's `encodeInto`? thoughts on letting it grow a growable buffer? (possibly with an opt-in option) that would be handy in some cases [13:55:24.0510] (similarly here) [13:55:37.0806] Reminder to everyone editing notes: we need a blank line between different speakers (this is Markdown) [13:55:52.0683] bakkot: won't have time to fully think it through until later, but first blush sgtm? [13:56:08.0667] it doesn't sound like a huge delta, and i appreciate not making the API even grosser [13:57:00.0082] and should we delete the introductory comments by Ujjwal? [14:01:22.0950] What is our conclusion on the ECMA-402 status update? Do we have consensus on the PR https://github.com/tc39/ecma402/pull/768 ? I share Jordan's concern that this should've been added to the agenda in advance so that folks could review. [14:21:47.0578] nobody objected, during or since, so i think it still has consensus. i brought it up as a procedural comment for the future 2023-05-16 [17:33:13.0098] > <@softwarechris:matrix.org> `Source Phase Imports for Stage 3 (cont’d from Day 1)` has been added to the schedule as the final item tomorrow I will not be available in the afternoon tomorfow, per my previously specified scheduling constraint. Given the only blocking concern is one I raised, it would be better if I'm able to be part of that discussion. [17:34:09.0012] * I will not be available in the afternoon tomorrow, per my previously specified scheduling constraint. Given the main concern is one I raised, it would be better if I'm able to be part of that discussion. [17:40:38.0237] rbuckton: Understood. I'm sorry, your constraint didn't mention source phase imports, and thus wasn't considered in the scheduling of the continuation. The time slot for the continuation was the only possible time/day for this item. I'll defer to guybedford and Luca Casonato for how they wish to proceed. [23:31:38.0906] littledan: it'd be great if we could ask the stenographer tomorrow to bump up their line length to as close to infinity as possible, and also to autocorrect any multiple spaces down into one, including after a period [23:43:52.0121] I've been running a regex on the notes post meeting to fix up the added line breaks and multiple spaces, we can keep doing this if they can't adjust their setting. (Just as an FYI) [01:10:42.0947] Chris de Almeida: any chance we can proceed on thu (in the afternoon overflow)? [04:19:54.0971] > <@ljharb:matrix.org> littledan: it'd be great if we could ask the stenographer tomorrow to bump up their line length to as close to infinity as possible, and also to autocorrect any multiple spaces down into one, including after a period Yes they are working on this (we are in touch by email) [05:22:50.0060] > <@lucacasonato:matrix.org> Chris de Almeida: any chance we can proceed on thu (in the afternoon overflow)? conflicts with KKL's constraint and JGT's constraint (although it appears JGT constraint is satisfied if it's the 13:00-13:30 slot) [05:23:08.0890] > <@lucacasonato:matrix.org> Chris de Almeida: any chance we can proceed on thu (in the afternoon overflow)? * conflicts with KKL's constraint (unavailable Thursday) and JGT's constraint (although it appears JGT constraint is satisfied if it's the 13:00-13:30 slot) [07:54:28.0298] Plenary begins in 5 mins!!! [07:54:41.0623] chairs: I don't know why I put 45 minutes for float16array, 15 is probably plenty [07:54:57.0957] if we end up having 15 minutes somewhere I am happy to do it wheenever [08:05:22.0565] I think stage 4 is always "pending final integration tweaks" [08:05:25.0948] thanks -- I've updated it in the schedule at hackmd [08:06:30.0576] the PR is open, I've reviewed it, and only had minor editorial feedback, nothing that would prevent it from advancing [08:07:02.0547] Sorry I need to drop due to a medical issue for my partner [08:07:07.0580] if others could take notes that would be great [08:10:14.0706] > <@softwarechris:matrix.org> conflicts with KKL's constraint (unavailable Thursday) and JGT's constraint (although it appears JGT constraint is satisfied if it's the 13:00-13:30 slot) I'm reaching out to others on my team to see if someone can be present for the overflow topic this afternoon. Unfortunately, I'm giving a talk in the afternoon that couldn't be rescheduled. [08:11:01.0489] OK, back [08:13:45.0926] > <@rbuckton:matrix.org> I'm reaching out to others on my team to see if someone can be present for the overflow topic this afternoon. Unfortunately, I'm giving a talk in the afternoon that couldn't be rescheduled. I do not think my presence is critical, though I would love to be present to support the champions. I do not contest the requested changes (or any of the considered options with regard to syntax). Chip will be present to represent Agoric in general. [08:14:39.0925] Luca Casonato: guybedford --- it appears the Thursday slot at 13:00 will work, per KKL's blessing there. sound good? [08:15:56.0704] /me merges https://github.com/tc39/proposal-array-grouping/pull/52 adding a warning to the README [08:17:42.0706] Is the best (only?) way to observer IsConstructor in client code to do IsConstructor = X => { try { class extends X { } } catch (e) { return e instanceof TypeError } return true } ? [08:18:24.0081] I'll also state that https://github.com/tc39/proposal-import-reflection/pull/45 addresses my concern. While it is unfortunate that the `import.()` format doesn't use a verb for the method name, doing so would break symmetry with the `import ` static syntax, so I'm not quite so concerned (for example, `import instance mod from "url"` could have a dynamic version named `import.instantiate(url)`, but that would break the symmetry that ljharb prefers). [08:19:52.0127] > <@tolmasky:matrix.org> Is the best (only?) way to observer IsConstructor in client code to do IsConstructor = X => { try { class extends X { } } catch (e) { return e instanceof TypeError } return true } ? no, you have to use Reflect.construct i believe [08:20:08.0731] > <@tolmasky:matrix.org> Is the best (only?) way to observer IsConstructor in client code to do IsConstructor = X => { try { class extends X { } } catch (e) { return e instanceof TypeError } return true } ? * you have to use Reflect.construct i believe if you support pre-class syntax engines [08:20:37.0517] But that has side-effects, or can have side effects, right [08:21:53.0435] https://github.com/tc39/ecma402/wiki/Proposal-and-PR-Progress-Tracking#stage-3 [08:30:57.0082] Francisco Tolmasky: yeah, there's no way to *just* test for `[[Construct]]` [08:31:49.0089] Michael Ficarra: Is that because class X extends Tested_Value { } also has side-effects (perhaps by having the prototype key be a getter or something) [08:34:04.0396] yeah, I think just the prototype getter [08:37:33.0237] > <@softwarechris:matrix.org> Luca Casonato: guybedford --- it appears the Thursday slot at 13:00 will work, per KKL's blessing there. sound good? I also need to confirm that Chip is willing and able to stand in for me. Please stand by. [08:39:51.0832] if we have a check mark, we might as well make that check link to the anchor where the urgent info is discussed [08:40:54.0430] prefer not to have a new col on the proposals table that is usually empty, but not a big deal if col is narrow [08:43:53.0514] I mildly prefer not to have this in the proposals table just so that there are not multiple sources of truth [08:44:10.0187] proposal links to the readme and readme documents seems like the right balance [08:44:14.0416] but I also don't care very much [08:44:19.0893] Kris Kowal: we may be able to move it to Wednesday though. please hold. apologies for the disarray -- tough shuffling with constraints 🙂 [08:44:28.0976] * proposals table links to the readme and readme documents seems like the right balance [08:44:44.0544] > <@bakkot:matrix.org> I mildly prefer not to have this in the proposals table just so that there are not multiple sources of truth Is the proposals list currently auto-generated? [08:44:55.0739] no [08:45:03.0265] no [08:45:17.0318] no, and it's missing things as such [08:45:23.0996] oh, I think to some extent, yeah [08:45:32.0432] for example the "last presentation" column is pretty outdated [08:45:35.0102] the website picks up the dataset from the dataset repo [08:47:45.0482] The summary is for major points raised; people keep dictating the conclusion and calling it the summary. It's OK if we don't have summaries, if people don't want to capture this information. [08:48:17.0520] the idea of the summary is to make a shorter version of the lengthy discussion above, so we capture more than just the conclusion [08:48:26.0368] of course dictating the conclusion is a really good practice and we should keep doing it! [08:48:42.0838] Francisco Tolmasky: I did it, but you're not gonna like it [08:49:14.0745] `let isConstructor = (a) => { if (a == null) { return false; } try { Promise.prototype.finally.call({ constructor: { [Symbol.species]: a }, then(){} }, () => {}) } catch { return false; } return true; }` [08:49:45.0878] interesting [08:49:52.0995] Why wouldn't I like it? I love it! [08:49:56.0472] i assume that only works with a native finally tho? [08:50:28.0524] > <@softwarechris:matrix.org> Kris Kowal: we may be able to move it to Wednesday though. please hold. apologies for the disarray -- tough shuffling with constraints 🙂 I’ve confirmed with Chip that you can ignore my constraint! Thanks. [08:51:36.0128] thanks Kris! I think the Weds option may work better for all involved, but waiting on Luca + Guy to proceed [08:53:23.0355] > <@softwarechris:matrix.org> Luca Casonato: guybedford --- it appears the Thursday slot at 13:00 will work, per KKL's blessing there. sound good? yes [08:53:55.0464] sorry, responded to wrong message [08:54:00.0627] yes to **wed** [08:54:07.0149] ok, perfect! thank you! [08:57:39.0369] this has the added benefit of offering double the available time (40 mins now instead of 20m) [08:59:12.0462] * `const isConstructor = (a) => { if (Object(a) !== a) { return false; } try { Promise.prototype.finally.call({ constructor: { [Symbol.species]: a }, then(){} }) } catch { return false; } return true; }` [08:59:50.0871] `Source Phase Imports for Stage 3 (cont'd from Day 1)` will be Weds afternoon [09:02:52.0213] waldemar I just tested this code with the _current_ proposal, and it alerts `5` as expected: ```js function minusTwo({ set, get }) { return { set(v) { set.call(this, v - 2) }, get() { return get.call(this) + 2; } } } function timesFour({ set, get }) { return { set(v) { set.call(this, v * 4) }, get() { return get.call(this) / 4; } } } class Foo { @minusTwo @timesFour accessor bar = 5; } const foo = new Foo(); foo.bar = 5; alert(`Serializing and de-serializing 5 yields ${foo.bar}`) ``` [09:03:25.0037] ( https://babeljs.io/repl#?browsers=ie%2010&build=&builtIns=false&corejs=3.21&spec=false&loose=true&code_lz=GYVwdgxgLglg9mABAWxmEBnAKgdzgCgG9EMBTKAGkQHNzEBfASkUIChFEAnckTpNjhzJR8AN2YDBQ8gDoIAQwA2i_FAAWMDFVGIAtIgBMjdoPoUTHWiIkXB3KLyRW5Sles3MA1IYDct-ib0AJCsAaygkLAIiLDIpBgAYnC8RCTkVFYMNhz2jiy2wmLZUmlQLsqqGlqIOgBUiAAsxlJmtlb4xVK5fDSyChXuGMwA9I1-LYEhYRCK8hgYiElw-RwAAqjo2HiIq7HxSbyI8hAQ8RhwnIgARvKXALyIAKx-0wgYUIjAcMsPYKQ4i2-HT84W-Mhu9yePhCSlInBEAAMAMpwmBKGAALzQ1COYAAJog8aRdGROGjFJjsU9EABPGCkRR4hYAEkIXzg4Nu9ARjCAA&debug=false&forceAllTransforms=false&modules=commonjs&shippedProposals=false&circleciRepo=&evaluate=true&fileSize=false&timeTravel=false&sourceType=module&lineWrap=true&presets=env%2Cstage-2&prettier=false&targets=&version=7.21.8&externalPlugins=&assumptions=%7B%7D ) [09:03:32.0852] * `const isConstructor = (a) => { if (Object(a) !== a) { return false; } try { Promise.prototype.finally.call({ constructor: { [Symbol.species]: a }, then(){} }); } catch { return false; } return true; }` [09:03:44.0186] * `const isConstructor = (a) => { if (Object(a) !== a) { return false; } try { Promise.prototype.finally.call({ constructor: { [Symbol.species]: a }, then(){} }); } catch { return false; } return true; };` [09:07:35.0983] ljharb: Outermost to innermost feels counterintuitive but if you think about the setters as successively wrapping each other, this is the natural order to fall out [09:07:59.0879] so the wrapping is what happens inner to outer [09:09:52.0924] ljharb: it'd need a queue, which is a very different design [09:10:21.0126] yeah [09:10:21.0238] a different design for who? spec/implementations, decorator authors, or decorator users? [09:10:25.0948] for the proposal itself [09:10:28.0939] I think the order of setters is correct, because this would be how it'd behave if you manually wrapped a class method [09:10:44.0216] for all stakeholders you list [09:10:46.0884] Also, the order of getters is correct (as discussed earlier) [09:11:13.0190] This issue is complex... I'm not sure I fully understand the issue and the consequences of each solution... [09:11:39.0265] like, i don't think of any use case for multiple decorators, legacy or standard, is "accumulate into a list, which is evaluated (setters, getters, initializers) in order later" [09:11:55.0232] if that is the model you think it ought to be, that's a redesign [09:13:09.0585] `const timesTwo = x => x * 2; const minusFour = x => x - 4; const wrapped = x => minusFour(timesTwo(x));` is what i'd expect [09:13:10.0704] IOW, mental model of decorators is _replacement_, so if you want multiple decorators to apply, you need to make a new wrapper that calls the old one [09:13:13.0713] As littldan said, decorators are like layers. You pass a value down through the layers when setting, and bring it back up through the layers when getting. So for `@A @B x`, setting traverses `-> A -> B -> x`, and getting traverses `<- A <- B <- x`. [09:13:24.0493] * Similar to what @littldan said, decorators are like layers. You pass a value down through the layers when setting, and bring it back up through the layers when getting. So for `@A @B x`, setting traverses `-> A -> B -> x`, and getting traverses `<- A <- B <- x`. [09:13:36.0885] it sounds like your mental model of decorators is _linear list of hooks_ [09:13:38.0960] which is not what it is [09:14:33.0778] Note that the _order of operations_ is different from _order of function calls_. Setters change the value before passing it to the next setter, while getters replace it after that it has been received by the next getter [09:14:45.0353] eemeli: yes, there are a lot of use cases for multiple decorators on an item. far too many to introduce this limitation, imo. [09:14:54.0172] * eemeli: yes, there are a lot of use cases for multiple decorators on an item. far too many to introduce that limitation, imo. [09:15:14.0258] Also chairs I'm travelling and I don't have a good connection, if when it's my turin in TCQ I don't reply please let other people go ahead [09:15:40.0175] * Note that the _order of operations_ is different from _order of function calls_. Setters change the value before passing it to the next setter, while getters replace it after that it has been received by the next getter (so same order of function calls implies opposite order of transforms) [09:15:56.0651] * Also chairs I'm travelling and I don't have a good connection, if when it's my turn in TCQ I don't reply please let other people go ahead [09:16:50.0451] nicolo-ribaudo: Would an `init()` change the order of the calls? [09:17:37.0437] Like, it seem the same as if we just `inits.reverse()` in the spec? [09:18:04.0365] > <@jridgewell:matrix.org> nicolo-ribaudo: Would an `init()` change the order of the calls? Having ```js init(v) { nextInit(v * 2) } ``` would allow having the same order of function calls as `set()` _and_ the same order of transforms [09:18:05.0298] We'd still have a queue of decorator inits that need to run in some order. [09:18:13.0955] Because it transforms the parameter rather than the return value [09:18:19.0150] * Because it transforms the input parameter rather than the return value [09:19:29.0134] I don't think that's the case? [09:20:26.0583] The reason set order happens is because there's a defined starting point (the thing that's exposed to the user of the class) [09:20:30.0460] > <@nicolo-ribaudo:matrix.org> Having > ```js > init(v) { > nextInit(v * 2) > } > ``` > would allow having the same order of function calls as `set()` _and_ the same order of transforms You would need to be sure to call `nextInit` with `this`, or you'd end up with an error. [09:20:47.0589] Well you already have that requirement with `set` and `get` [09:21:22.0578] Yes, but you don't with `init` currently. [09:21:33.0711] The `init` isn't exposed to the user, so there's not a defined order [09:22:07.0915] As I understand it, engines didn't want to thunkify the initializer. [09:23:28.0951] i don't quite remember the exact pushback [09:24:08.0887] oh, like, per-field, we don't want a per-field initializer function [09:24:21.0126] > <@shuyuguo:matrix.org> oh, like, per-field, we don't want a per-field initializer function Yep, that's it [09:24:40.0255] Every decorated field would need to have its own initializer function with my proposal [09:27:50.0867] Suggestion for fuller explanation: Decompose what happens into individual `Object.defineProperty()` calls in the order they would execute. [09:30:21.0814] > <@bradfordcsmith:matrix.org> Suggestion for fuller explanation: Decompose what happens into individual `Object.defineProperty()` calls in the order they would execute. IIRC, and from implementation, only a single defineProperty is called at the end. You need to show how the wrapping occurs, and step through the wrapped functions. [09:40:24.0335] ljharb: only assigning due to dynamic evaluation seems the opposite of what implementers want. IIRC, for the class to have a stable shape resulting from its declaration, then `[Symbol.metadata]` must be defined due to syntax, not dynamic evaluation. [09:40:37.0252] shu: ``` class A {} [09:40:52.0519] * shu: ``` class A {} class B extends A {} // gets A[symbol.metadata], goes to F.prototype ``` [09:40:59.0054] yes, okay, [09:41:00.0379] > <@rbuckton:matrix.org> ljharb: only assigning due to dynamic evaluation seems the opposite of what implementers want. IIRC, for the class to have a stable shape resulting from its declaration, then `[Symbol.metadata]` must be defined due to syntax, not dynamic evaluation. true, but that means that decorated classes *now* will suddenly start getting a metadata object [09:41:01.0403] thanks [09:44:12.0165] > <@ljharb:matrix.org> true, but that means that decorated classes *now* will suddenly start getting a metadata object Are there any shipping implementations of native decorators where that would be a problem? TS and Babel have downlevel implementations, but since this is only recently shipping I have less of a concern for this being a problem for our users. [09:45:45.0951] > <@ljharb:matrix.org> true, but that means that decorated classes *now* will suddenly start getting a metadata object * Are there any shipping implementations of native decorators where that would be a problem? TS and Babel have downlevel implementations, but since this is only recently shipping I have less of a concern for this being a problem for our (TS) users. [09:46:50.0407] Babel's implementation requires users to explicitly specify the date of the TC39 meeting (YYYY-MM) that they want Babel to comply with (there were too many changes to do otherwise 😬), so I'm not concerned of this type of breaking changes [10:55:10.0904] I think the error rate was particularly high in the second hour of the morning, and ljharb noted similarly. I contacted Duane, the owner of the captioning service, and the person who was on during that time block won’t end up repeating for the rest of this meeting; it will be shared by the same two people so they should be able to learn and improve over time. Please be like ljharb and send me any feedback about the notes so I can collect it and ensure it reaches the transcription service. [10:58:35.0123] > <@ljharb:matrix.org> true, but that means that decorated classes *now* will suddenly start getting a metadata object Honestly I've been thinking of the decorators proposal as work-in-progress until the metadata part is done. So to me this isn't as much of a case of changing what is already out there. [10:59:44.0232] Plenary is restarting... now [11:03:56.0582] About this presentation, I'd sort of like to discuss both topics together before drawing a conclusion [11:04:15.0249] fine to discuss one first in between of course, just for concluding [11:07:55.0066] It seems option 1 is more consistent to current iterator behavior? [11:09:38.0173] I believe the transcription quality is higher this time than last time [11:16:07.0446] littledan: "with fallback only on undefined" - do you mean and _not_ null? Symbol.iterator uses undefined or null [11:16:13.0823] (because it goes via GetMethod) [11:18:02.0638] Aren't iterators always supposed to meet the requirement that `myIterator[Symbol.iterator]() === myIterator` ? Doing this fallback at all seems weird to me. [11:20:43.0765] Bradford Smith: nothing in the language expresses that requirement today, and user-implemented iterators IME usually don't [11:21:29.0384] and the main place this fallback comes up is in `Iterator.from`, which is specifically for taking a userland iterator and getting something which inherits from Iterator.prototype; we want to accept the user iterators people are writing today [11:21:56.0103] > <@bakkot:matrix.org> littledan: "with fallback only on undefined" - do you mean and _not_ null? Symbol.iterator uses undefined or null Oops yeah my mistake for trying to correct notes and participate at the same time [11:22:00.0320] Interesting. I'm pretty sure closure-compiler's transpilatoin of for-of and similar things relies on `myIterator[Symbol.iterator]() === myIterator` [11:22:16.0967] I don't think we check for a `next()` method [11:22:34.0992] > <@bradfordcsmith:matrix.org> Aren't iterators always supposed to meet the requirement that `myIterator[Symbol.iterator]() === myIterator` ? Doing this fallback at all seems weird to me. well yeah we're talking about iterables (anyway that is more a convention than a requirement) [11:22:57.0946] Bradford Smith: for-of takes iterables, not iterators, so I don't think it comes up? [11:23:16.0075] like the way you work with iterators is always "call the Symbol.iterator method, and then call `next` on the result" [11:23:19.0144] I thought it was a requirement that all iterators are also iterables [11:23:42.0727] nothing depends on or expresses that requirement [11:25:25.0900] Michael Ficarra: Not sure I explained myself clear, I expect we can define a protocol which only have accessors which returns normal value, for example `obj[ProtocolA.x] // normal value`. [11:25:59.0886] So then `Iterator.from(x)` first tries to treat`x` as an iterable, then falls back to treating it as an iterator, which doesn [11:26:16.0033] * So then `Iterator.from(x)` first tries to treat`x` as an iterable, then falls back to treating it as an iterator, which doesn't happen to have a `Symbol.iterator` [11:29:06.0514] correct [11:29:59.0438] all the iterators _in the language_ (and the web platform / node, and those produced by generators) have the property that `myIterator[Symbol.iterator]() === myIterator`, so that should work for everything [11:30:13.0564] unless you go out of your way to make an iterator which _does_ have a `Symbol.iterator` which is not just `this`, in which case, that's on you [11:33:51.0331] I will support failing early if we can "fix" `let [] = {[Symbol.iterator](){return {}} }` case... [11:39:19.0404] I think option 2 not closing is actually pretty bad [11:39:42.0383] well [11:39:45.0303] a little bad anyway [11:43:36.0903] bakkot: but it never "opens" either [11:43:51.0513] fair [11:44:04.0014] at least in the case that you're passing a multiple-shot-iterator [11:44:09.0256] * at least in the case that you're passing a multiple-shot iterable [11:45:31.0787] but not in the case that you're passing an iterator: ``` function* gen(){ yield 0; } let it = gen(); [] = it; // close gen console.log(it.next().done); // true ``` [11:45:49.0156] it is weird for the "close gen" thing to happen if you have `[x] = it` but not `[] = it` [11:46:00.0896] why? if it hasn't touched it why would it need to close it [11:46:52.0536] > <@ljharb:matrix.org> why? if it hasn't touched it why would it need to close it Consistency with pattern matching? [11:47:10.0256] A pattern like `[]` is exhaustive, thus will close the iterator. [11:47:13.0945] pattern matching is still stage 1 and i would assume it would just follow whatever is decided here [11:47:15.0443] * A match pattern like `[]` is exhaustive, thus will close the iterator. [11:47:24.0354] ah, hmm [11:47:52.0386] > <@ljharb:matrix.org> pattern matching is still stage 1 and i would assume it would just follow whatever is decided here It can't if array patterns are exhaustive [11:48:11.0658] My main feeling is, it doesn't seem worth it to change existing things, and 3 and 4 both seem reasonable to me [11:48:11.0793] yeah that kind of falls out of the weirdness of having destructuring not be exhaustive by default, and pattern matching be by default [11:48:28.0069] That said, a match pattern of `[]` will call `next()` at least once [11:48:38.0006] ah yes, that's true [11:49:36.0584] Actually, I honestly don't know if pattern matching informs whether empty array destructuring patterns should close. There's enough of a difference that we could go either way. [11:54:31.0918] Sorry, could anyone write a simple example to explain the observable diff between option 2 and 3? [11:54:36.0794] (fwiw i don't think the animal names are necessarily consistent across users) [11:54:51.0748] * (fwiw i don't think the animal names are necessarily consistent across users, but i haven't tested thoroughly) [11:54:58.0307] principle: always be vibin' [12:05:23.0892] can someone who maintains TCQ make it so the reply / new topic / clarifying question / PoO buttons take effect immediately when pressed and then you can enter the topic later? [12:05:35.0803] I'm tired of writing out a topic in the reply just for us to move on :-( [12:06:09.0756] bakkot: https://github.com/search?q=language%3Ajavascript+grouptoobject&type=code [12:06:49.0874] sorry I meant as a property name specifically [12:06:50.0623] but yes [12:06:56.0544] I see one or two there [12:07:01.0368] * I see one or two there which are properties [12:07:17.0491] someone claimed "group" was sufficiently obscure? what? [12:07:42.0349] > <@ljharb:matrix.org> bakkot: https://github.com/search?q=language%3Ajavascript+grouptoobject&type=code I see two or three obj.groupToObject and prototype.groupToObject ... 😅 [12:07:57.0267] in there i see `Group.prototype.toObject` but no `prototype.groupToObject`? [12:08:05.0298] either way only 64 results on github is astonishingly rare [12:08:56.0523] yo i have an idea [12:09:04.0218] What about the static methods? No need to worry the web compat issue. [12:09:19.0487] in this particular case I'm fine with static methods [12:09:27.0581] but I can imagine having other methods in the future [12:09:33.0180] e.g. I would really like a "sortBy" [12:09:40.0477] even though it unfortunately cannot be called that probably [12:09:47.0746] and it would be a huge shame for that to be static [12:10:10.0547] what if we change the identifier grammar such that there's some prefix of code units that doesn't parse for assignments and only parse for get (might need runtime errors too i guess) [12:10:34.0795] * what if we change the identifier property name grammar such that there's some prefix of code units that doesn't parse for assignments and only parse for get (might need runtime errors too i guess) [12:11:49.0663] Would it be possible to add it inside iterable helpers? [12:12:23.0823] > <@wmartins:matrix.org> Would it be possible to add it inside iterable helpers? As I understand, it will be a different proposal, might have differnt semantic. [12:12:25.0491] Wouldn't it be `Object.groupBy()` since it returns an object? [12:12:43.0077] yeah i actually was thinking that too [12:13:06.0437] Willian Martins: no, we cannot fit a possibly infinite structure into a finite structure [12:13:16.0841] https://github.com/tc39/proposal-array-grouping/issues/51#issuecomment-1372786948 [12:13:40.0768] That makes sense. Thanks! [12:13:42.0174] > <@bradfordcsmith:matrix.org> Wouldn't it be `Object.groupBy()` since it returns an object? that's what's in the PR, yeah: https://github.com/tc39/proposal-array-grouping/pull/47 [12:13:56.0594] was something else proposed? I missed it if so [12:16:52.0123] i think a few of us just misspoke and said "Array.groupBy" [12:17:02.0846] ah cool [12:17:04.0443] There are already some stage 1 proposals of Array.prototype methods. For example Array.prototype.unique [12:18:55.0968] the stage 3 proposal list isn't huge, it shouldn't take long to go through them [12:19:09.0441] https://github.com/tc39/proposals#stage-3 [12:22:12.0004] hey saminahusain ! [12:22:39.0807] Could someone with admin rights give Samina the Custom(10) rights to post here? [12:24:16.0624] Ok, thanks [12:25:36.0290] fwiw the group PR has been rebased: https://github.com/tc39/proposal-array-grouping/pull/47 spec is here: https://raw.githack.com/tc39/proposal-array-grouping/static-method/index.html [12:26:23.0840] > <@ljharb:matrix.org> i think a few of us just misspoke and said "Array.groupBy" Yup, I meant `Object.groupBy` [12:59:13.0269] does anyone know how to say "if a List has at least one item" in spec? [12:59:19.0866] * does anyone know how to say "if a List has at least one element" in spec? [12:59:24.0092] does that statement work? [13:00:18.0060] "if a List is not empty"? [13:01:01.0164] we're at time so i need to hop off [13:02:14.0408] yeah you want "is not empty" [13:02:40.0333] pzuraq: might want to ask these questions in #tc39-editors:matrix.org next time [13:03:57.0299] what is happening [13:04:14.0217] are we, as tc39 delegates, able to confer IPR protection by forming a TG? [13:04:20.0635] I had to step away and did not capture speakers for the last few minutes [13:04:21.0748] like that's cool if we are [13:04:27.0234] please could people edit that into the notes [13:04:29.0934] if you remember who said what [13:05:30.0094] littledan: Since you fit this into a shorter time slot, you could bring this back as overflow later in this meeting for TG4 creation consensus. [13:05:58.0473] littledan: we will also have to assign chairs and (when we get approval for a new document) assign an editor group [13:06:07.0551] > <@shuyuguo:matrix.org> are we, as tc39 delegates, able to confer IPR protection by forming a TG? If we create the TG, I think we can. [13:06:47.0188] msaboff: how does the transfer of the existing source maps document work? [13:07:22.0981] or is the idea that we start with safeguarding newly produced IP by forming a new TG within which to produce new IP, then do the transfer and merge later with the existing doc? [13:07:47.0613] Not totolly sure, but if all the participants are Ecma members it should be straightforward . [13:07:53.0650] * Not totally sure, but if all the participants are Ecma members it should be straightforward . [13:08:08.0209] yeah the doc was written by Mozilla + Google so it should be fine [13:08:08.0218] huh, interesting [13:08:16.0510] that's cool [13:09:32.0054] I'm vaguely sympathetic with the idea that we shouldn't jump straight into making a TG prematurely, but at the same time, adopting liberal IPR policy isn't the "too fast" part--it's really the only option for a modern open standard IMO. [13:09:48.0409] > <@msaboff:matrix.org> littledan: Since you fit this into a shorter time slot, you could bring this back as overflow later in this meeting for TG4 creation consensus. Thanks, yeah, I'd like to do this [13:10:13.0577] > <@michaelficarra:matrix.org> littledan: we will also have to assign chairs and (when we get approval for a new document) assign an editor group I'd like to nominate myself as chair :) I'm optimistic that we'll have volunteers for editor as soon as I raise it. [13:11:37.0957] > <@msaboff:matrix.org> If we create the TG, I think we can. I believe so too. At the same time, this IPR protection only really kicks in once we publish a standard (that's what the opt out period is for) [13:13:42.0082] littledan: I think just as long as those that participated in the current draft release any claim on IP. If it is only Google and Mozilla, that shouldn't be an issue. [13:15:14.0395] I think it should be fine for us to collaborate on a draft with all the same legal theories that we use to participate in drafting the ECMA-262 spec [14:11:41.0461] also note that the current source map spec is CC-licensed [14:31:52.0568] > <@michaelficarra:matrix.org> `const isConstructor = (a) => { if (Object(a) !== a) { return false; } try { Promise.prototype.finally.call({ constructor: { [Symbol.species]: a }, then(){} }); } catch { return false; } return true; };` are Proxies allowed? ``` function isConstructor(f) { let v = false; try { Reflect.construct(new Proxy(f, { construct() { v = true; } }), []); } catch() {}; return v; } ``` [14:43:27.0950] bakkot spec has been updated: https://github.com/pzuraq/ecma262/pull/10/files [14:47:57.0861] > <@pzura:matrix.org> bakkot spec has been updated: https://github.com/pzuraq/ecma262/pull/10/files I love how small this specification is. It makes me feel like we got it right. [14:48:22.0498] > <@aclaymore:matrix.org> are Proxies allowed? > > ``` > function isConstructor(f) { > let v = false; > try { > Reflect.construct(new Proxy(f, { > construct() { v = true; } > }), []); > } catch() {}; > return v; > } > ``` i still would love one that doesn't require ES6 but i don't think there is one :-/ [14:48:54.0368] > <@littledan:matrix.org> I love how small this specification is. It makes me feel like we got it right. I should've listened to you in the beginning, we definitely over designed it at first 😅 [14:48:58.0284] but we got there eventually [14:49:31.0807] the final design is simpler than what I initially proposed [14:49:38.0195] a lot simpler [15:05:44.0636] I’m wondering whether decorators for derived classes are likely to continue to function if the `Symbol.metadata` of the base class is frozen. But more importantly, hoping there’s somewhere I can putter to find out. [15:20:31.0077] > <@pzura:matrix.org> bakkot spec has been updated: https://github.com/pzuraq/ecma262/pull/10/files I like how `Function prototype @@metadata` is `null`. Good hole to plug. [15:21:54.0782] (And non configurable) [15:24:10.0199] > <@kriskowal:matrix.org> I’m wondering whether decorators for derived classes are likely to continue to function if the `Symbol.metadata` of the base class is frozen. But more importantly, hoping there’s somewhere I can putter to find out. Maybe we fix the overrride mistake but only for metadata objects? 😎 [15:25:36.0733] > <@aclaymore:matrix.org> Maybe we fix the overrride mistake but only for metadata objects? 😎 The derived metadata inherits prototypically from the base metadata? [15:29:57.0880] yes [15:30:06.0052] indeed i think it applies the same way here [15:38:05.0420] That seems okay to me. [15:38:45.0759] It’s the devil we know, any any case, and I imagine there will be herding behaviors to promote composition of unrelated decorators, favoring disjoint gensyms on metadata when possible. [15:39:28.0938] * It’s the devil we know, any any case, and I imagine there will emerging convergent behaviors to promote composition of unrelated decorators, favoring disjoint gensyms on metadata when possible. 2023-05-17 [08:01:04.0024] morning all [08:01:06.0933] and/or whatever time it is [08:01:08.0917] Plenary is starting now! [08:01:24.0730] Please join to find out if TC39 will approve ES2023 [08:01:53.0731] I hope it gets approved 😬 [08:02:20.0562] please vote yes 🥺 [08:35:04.0178] Frank's comments are generally talking in terms of various absolutes which I think are too strong [08:51:23.0992] we need to clean up the notes for the conclusion of ZDT stage 1 [08:51:44.0221] I wrote a conclusion right under the heading; now writing main points [08:51:49.0186] (not deleting the raw notes just yet) [08:52:30.0849] ptomato: Is there any risk that zone date time formatting might require a temporal constructor to close over host data? At Agoric, we’ve enjoyed the separability of now() from temporal constructors and hope for that trend to continue. [08:52:51.0502] thanks for your hard work on the notes, Dan! really appreciate it. time at a premium today, so needed to move [08:56:21.0376] > <@kriskowal:matrix.org> ptomato: Is there any risk that zone date time formatting might require a temporal constructor to close over host data? At Agoric, we’ve enjoyed the separability of now() from temporal constructors and hope for that trend to continue. I think this is safe, Temporal constructors still don't close over any host data. FWIW you can currently already format `Temporal.ZonedDateTime` with its `toLocaleString` method; you just can't cache the expensive operations by creating a formatter object to format multiple `ZonedDateTime`, and you can't `formatRange` or `formatToParts`, so that's what this proposal is solving. [08:56:30.0097] `Intl.DateTimeFormat` does close over host data, because if you construct it without a `timeZone` parameter then it internally assumes the host's current time zone, but that's a long-preexisting problem and I'm assuming you're not referring to that [08:57:35.0275] my preferred solution would actually remove that closing over host data in the case of ZonedDateTime. (in other cases, it wouldn't be web-compatible to change that) [09:08:04.0828] I do not like "eliminates the need for developers to understand higher-order functions" as a motivation for design decisions [09:08:08.0078] I really really do not like it [09:08:20.0021] I think we should avoid subclassing AsyncSnapshot... it's confusing for these examples [09:08:31.0643] this is a has-a relation, not a is-a [09:09:38.0161] ``` const snapshot = new AsyncSnapshot(); snapshot.run(cb, arg1, arg2); ``` [09:09:45.0467] That's how I would normally use it. [09:28:16.0056] Do you have the Task attribution link? I don't know the scope of this api. [09:28:28.0760] https://docs.google.com/document/d/1_m-h9_KgDMddTS2OFP0CShr4zjU-C-up64DwCrCfBo4/edit#heading=h.pny1oyazzdg0 [09:29:03.0241] https://bit.ly/task-attribution friendly link [09:30:48.0980] Termination is https://github.com/tc39/proposal-async-context/issues/52 [09:30:55.0333] It's still WIP, and not proposed to be added yet [09:50:34.0224] https://notes.igalia.com/p/TWx5MikWg [09:50:59.0970] > <@usharma:igalia.com> https://notes.igalia.com/p/TWx5MikWg I think that's not visible publicly [10:24:02.0236] > <@abotella:igalia.com> I think that's not visible publicly Should be fixed now [11:14:33.0797] There's a reason why the W3C broke off from IETF--to not deal with this bureaucracy. (And then WHATWG broke off from W3C for the same reason...) [11:14:53.0810] We don't realize how lucky we are bureaucracy-wise! [11:16:08.0117] "You are now DAC, the do anything committee" [11:17:58.0025] it's oddly non-bureaucratic in certain ways as well.. IETF WGs are `mailing list all the things` and consensus, no voting, no memberships, etc [11:18:12.0593] the default state of being is no bureaucracy; these organisations do this to themselves [11:18:22.0364] but IESG gatekeeping... [11:42:37.0265] chipmorningstar and I’ve been ruminating a procedural question regarding the staging process. It’s our understanding that a canonicalization proposal must be preceded by a beatification proposal. Did we miss something? [11:44:26.0442] the syntax of IANA time zone identifiers: > Use only valid POSIX file name components (i.e., the parts of names other than `/`). Do not use the file name components `.` and `..`. Within a file name component, use only ASCII letters, `.`, `-` and `_`. Do not use digits, as that might create an ambiguity with POSIX TZ strings. A file name component must not exceed 14 characters or start with `-`. [11:46:15.0137] (but then there are a few legacy aliases in the TZDB that don't follow these rules) [12:05:20.0860] I like `Promise.create`! [12:05:38.0986] creat pls [12:06:51.0050] But `Promise.create` will have very different api with `Object.create`? [12:07:05.0187] ... so? [12:07:29.0539] `Promise.create` does have baked in anti-bikeshedding... [12:07:37.0786] I expect the same method name would have similar api. [12:08:05.0519] i regret to inform you there are only a few good english words [12:08:35.0258] what. `Promise.embiggen` is a perfectly cromulent option [12:08:37.0536] Promise.deconstructed [12:08:44.0051] Promise.unpacked [12:08:48.0776] hey hey hey take it to TDZ [12:08:59.0136] > <@pchimento:igalia.com> what. `Promise.embiggen` is a perfectly cromulent option winner right here [12:08:59.0619] Personally I prefer Promise.deferred [12:10:28.0488] Ditto, I want `deferred` [12:10:38.0649] Rejection is resolution. [12:10:52.0665] https://github.com/tc39/proposal-promise-with-resolvers/issues/2 [12:11:00.0427] bikeshedding thread ☝️ [12:11:06.0759] The precedent is strong: https://github.com/tc39/proposal-promise-with-resolvers/issues/2#issuecomment-1483909052 [12:11:17.0702] It's always misunderstanding what "resolve" means in the community [12:11:34.0423] ljharb: Indeed! Resolve can defer, fulfill, or reject! [12:11:48.0260] preference for `embiggen` but will settle for `deferred` [12:11:53.0250] we need to resolve the meaning of resolve [12:12:06.0190] lol i suppose it could be "fulfillers" or something [12:12:10.0753] Resolve, fulfill and other promising terminology is clarified in [States and Fates.](https://github.com/domenic/promises-unwrapping/blob/master/docs/states-and-fates.md) [12:12:34.0829] `Promise.unwrap` [12:13:02.0157] I’m not even sure how far back `Q.defer()` goes. It may have gone back to Q from Tyler Close’s Waterken, but it may have started with my work. [12:13:23.0147] My reasoning was that `Q.defer() => Deferred` [12:13:33.0147] > <@softwarechris:matrix.org> preference for `embiggen` but will settle for `deferred` I guess many non-native speakers (like me) don't know the word... [12:13:52.0136] > <@softwarechris:matrix.org> preference for `embiggen` but will settle for `deferred` * I guess many non-native speakers (like me) don't know the word `embiggen`... [12:13:58.0387] IIRC, JQuery started with `defer` as well [12:14:08.0747] `Promise.withLifecycle` [12:14:10.0747] (It's a joke from The Simpsons, it's not an actual English word) [12:14:13.0632] it's not a real word, it's a Simpsons reference (that's kind of become a real word) [12:14:34.0896] it is an actual english word _now_ [12:14:50.0584] It does indeed go back to Tyler Close’s Waterken ref_send/web_send library https://waterken.sourceforge.net/web_send/ [12:15:04.0964] https://www.merriam-webster.com/dictionary/embiggen :) https://www.merriam-webster.com/dictionary/cromulent :( [12:15:33.0795] > <@robpalme:matrix.org> Resolve, fulfill and other promising terminology is clarified in [States and Fates.](https://github.com/domenic/promises-unwrapping/blob/master/docs/states-and-fates.md) Unfortunately some libraries (like jQuery) not follow it many years [12:16:00.0541] i declare shenanigans [12:16:02.0637] From the reading I've done, it seems like the ecosystem migration from `.defer()` to `new Promise` was due to the executor being safer as it could capture an unexpected exception and reject the promise. That meant that `new Promise` was a _better_ API for the more common use cases, not that `.defer()` in and of itself was a _bad_ API. [12:16:30.0127] Waterken’s use of defer() goes back to 2004. [12:16:33.0257] I kinda liked `Promise.capability`, but possibly only because I'm familiar with that name from the spec using it [12:16:34.0087] So it seems like this almost exactly matches how `.defer()` was used in Q and JQuery. [12:17:27.0845] (`Promise.withResolvers` also seems fine) [12:17:30.0746] in jquery the promise itself had resolve and reject methods on it [12:17:34.0388] (`Promise.defer` seems somewhat less fine) [12:17:35.0864] * in jquery the promise itself had resolve and reject methods on it, so i don't think that's a match [12:17:42.0447] `defer` implies something time-based to me, akin to `setTimeout` [12:17:45.0481] let's do `Promise.bikeshed` [12:17:53.0388] @bakkot `Promise.caps` would be more apropos. The original idea is that the read-cap and write-cap could be distributed to different parties. [12:18:07.0951] "cap" reads to me as a hat, not short for "capability" :-p [12:18:08.0219] And I'm probably not the only one that's called the same functionality `defer` or `deferred` in my own code and in npm packages (i.e., https://www.npmjs.com/package/@esfx/async-deferred though that exports a class called `Deferred`) [12:18:18.0140] `cap` means `lie` actually [12:18:22.0155] nope https://npmjs.com/promise-deferred [12:18:23.0639] > <@ljharb:matrix.org> "cap" reads to me as a hat, not short for "capability" :-p no cap [12:18:25.0281] * `cap` means "lie" actually [12:18:28.0940] FALSE. it's a real word [12:18:38.0303] > <@rbuckton:matrix.org> And I'm probably not the only one that's called the same functionality `defer` or `deferred` in my own code and in npm packages (i.e., https://www.npmjs.com/package/@esfx/async-deferred though that exports a class called `Deferred`) Not the distinction I beg :-) [12:18:38.0323] stop gatekeeping [12:18:48.0675] `Promise.gatekeep` [12:19:05.0790] If we end up going with defer, ideas for alternative names for https://github.com/tc39/proposal-defer-import-eval/ are welcome :P [12:19:34.0171] see that's the normal thing that `defer` means [12:19:41.0128] > <@danielrosenwasser:matrix.org> no cap frfr [12:19:46.0581] I am supportive of Promise.withResolvers(), and failing that, Promise.defer(). Of others I can be convinced. Really, just want the darn feature already. [12:19:49.0397] we should reserve the use of `defer` for its standard usage and find a different name here [12:19:58.0735] * we should reserve the use of `defer` for its standard English usage and find a different name here [12:20:18.0069] NB: it was part of the ES promise proposal at one point, and was called `deferred` [12:20:25.0202] `Promise.deconstruct` [12:20:46.0030] that sounds like undoing what the Promise constructor does [12:21:03.0733] Was I the only person who thought the plan was to have `import.source` for both static and dynamic import? [12:21:10.0802] well -- `Deferred` is the object returned from `Promise.defer()` [12:21:28.0058] I thought part of the point was to fix syntax ambiguity. [12:21:42.0480] no, i thought the same [12:22:19.0825] > <@pchimento:igalia.com> that sounds like undoing what the Promise constructor does well, that'd be `Promise.destruct` 😳 [12:22:33.0996] true [12:22:58.0815] `Promise.gozer` [12:24:04.0363] > Derrida describes the task of deconstruction as the identification of metaphysics of presence. Metaphysics of presence is the desire for immediate access to meaning, the privileging of presence over absence. half-joking here, but why not [12:24:55.0413] I like meta method :) [12:25:10.0181] Most `.withX` methods I've seen generally don't behave this way either. I normally expect it to mean "the same thing, but with something changed" or "this thing plus that other thing", such as `date.withCalendar` in Temporal: https://tc39.es/proposal-temporal/docs/plaindate.html#withCalendar [12:25:29.0847] `Promise.meta.url` [12:25:31.0691] or `with` on Array.prototype for that matter [12:26:47.0975] ljharb: just do `import source a from 'b'; const from = a;` [12:27:33.0373] or `import source { default as from } from 'b';`, sure. but it's awkward [12:27:51.0329] wait what that shouldn't work [12:27:58.0840] the unicode escape should be the same [12:27:59.0012] no? [12:28:03.0381] I think Luca is wrong here [12:28:15.0629] The spec right now uses "source text matched by" [12:28:22.0621] For the restriction [12:28:46.0925] why? [12:28:55.0934] > <@bakkot:matrix.org> or `with` on Array.prototype for that matter but I think this is only really true for instance methods [12:28:59.0818] static methods are a different beast [12:29:06.0872] I don't think it's likely to be confusing [12:29:14.0490] > <@michaelficarra:matrix.org> why? Tbh the reason is that he asked me how to do it and I didn't think about a lookahead restriction 😅 [12:29:19.0226] Have we considered source phase imports and export declarations? i.e., do we have to do ```js import source x from "y"; export { x }; ``` but can't do ```js export source x from "y"; ``` ? [12:29:34.0917] that seems reasonable to do [12:29:40.0840] nicolo-ribaudo: we should def change it, that is something I would bring up during editorial review [12:29:52.0343] > <@rbuckton:matrix.org> Have we considered source phase imports and export declarations? i.e., do we have to do > ```js > import source x from "y"; > export { x }; > ``` > but can't do > ```js > export source x from "y"; > ``` > ? I think it should be supported, but `export x from "x"` is currently invalid too [12:30:15.0801] precedent: await.all ? [12:30:19.0561] > <@nicolo-ribaudo:matrix.org> I think it should be supported, but `export x from "x"` is currently invalid too Yes, but you *can* do `export { default as x } from "x";` [12:30:39.0668] > <@haxjs:matrix.org> precedent: await.all ? Well that proposal didn't go very well last time it was presented if I recall correctly [12:30:44.0117] `super.foo` and `super.foo()` are unrelated [12:30:51.0981] to each other [12:30:55.0957] those are very related! [12:31:12.0104] Which is why I brought up the topic, if we did want `export source { default as x } from "y"`, then wouldn't we want `import source { default as x } from "y"`? [12:31:47.0744] Yeah I agree we should support the export from, it was even included in some slides I presented at some point I think [12:31:49.0795] > <@nicolo-ribaudo:matrix.org> Well that proposal didn't go very well last time it was presented if I recall correctly yeah, so it's not the precednet , just similar tries... [12:31:57.0183] Maybe in the slides I presented on Monday [12:32:04.0588] * Which is why I brought up the topic. If we did want `export source { default as x } from "y"`, then wouldn't we want `import source { default as x } from "y"`? [12:32:21.0887] i dislike `import.source` in static imports personally [12:32:35.0473] it's treating symmetry between static and dynamic forms as a goal, whereas that's just a "nice to have" constraint imo [12:32:49.0482] Strongly favor the proposal as presented today. [12:33:00.0986] the goal, as Guy said, is to have something that's nice to type, so people will type it, and get the nice static analysis guarantees from bundlers and toolings [12:33:04.0216] * the goal, as Guy said, is to have something that's nice to type, so people will type it, and get the nice static analysis guarantees from bundlers and tooling [12:33:29.0173] sure [12:33:43.0312] i'm not sure `import source` and `import.source` are meaningfully different to type tho, and they're identical for static analysis [12:33:58.0208] obv if folks just straight up find it icky then that matters [12:34:14.0040] it does give some ick, tbf [12:34:17.0480] I do find the `.` as indicative of dynamic. [12:34:19.0035] We discussed LR1 in https://github.com/tc39/notes/blob/ace580d512db32624bd74b843e0d9757278753cd/meetings/2017-11/nov-29.md?plain=1#L303 [12:34:19.0764] yeah to be clear i'm purely talking about subjective ickiness [12:34:25.0200] I find it ugly, but I don't have any technical reason against it [12:34:47.0147] and i'm perfectly content to accept that a number of folks find it icky :-) i just want to be clear in that case that that's the rationale, nothing technical [12:35:08.0219] > <@shuyuguo:matrix.org> it's treating symmetry between static and dynamic forms as a goal, whereas that's just a "nice to have" constraint imo This is actually a huge improvement for bundlers [12:35:25.0537] https://matrix.to/#/!RkpmGMjJtqLKXzByOT:matrix.org/$a5LIDdkHQL28xkgFoGx8emGNcVNOEI4BejJWms32dG8?via=matrix.org&via=igalia.com&via=mozilla.org [12:35:27.0939] > <@jridgewell:matrix.org> This is actually a huge improvement for bundlers oh interesting, so you're pro `import.source` in the static form? [12:35:33.0595] > <@jridgewell:matrix.org> This is actually a huge improvement for bundlers Why do bundlers prefer a dot over a space? [12:35:55.0143] likei understand `import.static` for the _dynamic_ change is a big improvement for bundlers [12:35:58.0759] No preference on whether dot or space, just the syntatic requirement [12:35:59.0189] * likei understand `import.static` for the _dynamic_ form is a big improvement for bundlers [12:36:10.0465] why is it an improvement in the static case? [12:36:21.0989] being syntactic is a huge improvement for linters too :-) [12:36:23.0048] It prevents accidental deoptimizations [12:36:30.0544] what? [12:36:48.0799] how can a static `import` deopt? [12:37:00.0831] Having a dynamic `import("foo.js", attributesComputedAtRuntime)` would cause us to add a lot of extra code to handle phase imports [12:37:08.0573] I think you're talking past each other [12:37:11.0789] yes, that's the... dynamic case [12:37:22.0922] i am asking, how does `import.source` help the _static_ case [12:37:24.0662] Static import can't depot, only the dynamic case [12:37:39.0811] Oh, I thought you were reference the static syntax in dynamic import [12:37:46.0438] yes, so... again, how does `import.source` help bundlers in the _static_ import case [12:37:59.0504] It doesn't [12:38:16.0572] okay, that matches my intuition, thanks [12:38:48.0585] I don't think anybody has made a case for `import.source` in the decl form other than "it matches", which is not strong IMO [12:39:17.0091] Who made the +1 reply that we just went through? [12:39:47.0595] > <@michaelficarra:matrix.org> I don't think anybody has made a case for `import.source` in the decl form other than "it matches", which is not strong IMO it avoids an ambiguity here, is the other reason [12:40:07.0948] Note `import.source` also help to solve `import source \n from` ambiguity for module declarations (`module source {}`). [12:40:24.0415] bakkot: not an actual ambiguity, an imagined one [12:41:43.0619] I completely agree with Guy here, we don't need to worry about future syntax for this [12:41:49.0296] yeah [12:41:50.0346] apologies for creating the confusion about `from` [12:47:06.0701] > <@softwarechris:matrix.org> NB: it was part of the ES promise proposal at one point, and was called `deferred` I’m not suggesting that `Promise.defer` should be preferred based on historical precedent, but Mark originally proposed `defer` https://web.archive.org/web/20160404122250/http://wiki.ecmascript.org/doku.php?id=strawman:concurrency#q.defer [12:47:09.0875] If the concern around `import source from from` being ambiguous with module declarations, we could consider an alternate syntax for importing those declarations as well. i.e., `import x from ` (with the literal `<>` characters), so there would be no ambiguity. [12:47:24.0621] * If the concern around `import source from from` is it being ambiguous with module declarations, we could consider an alternate syntax for importing those declarations as well. i.e., `import x from ` (with the literal `<>` characters), so there would be no ambiguity. [12:47:37.0171] what? we already ban `let` [12:49:38.0029] > <@kriskowal:matrix.org> I’m not suggesting that `Promise.defer` should be preferred based on historical precedent, but Mark originally proposed `defer` https://web.archive.org/web/20160404122250/http://wiki.ecmascript.org/doku.php?id=strawman:concurrency#q.defer right -- I clarified after this Promise.defer() -> Object Deferred [12:49:59.0686] Not a huge fan of `import.source x from "y"`, to be honest. I understand its an option, but I'd rather not break that glass unless we need to. [12:50:13.0825] And it seems we don’t need to. [12:50:23.0611] Sorry, what would be the meaning of `export source ...`? [12:50:36.0588] > <@rbuckton:matrix.org> Not a huge fan of `import.source x from "y"`, to be honest. I understand its an option, but I'd rather not break that glass unless we need to. Yeah, I'm generally convinced that pseudo properties will be weird outside of expression context (exactly the reason why it's normal for dynamic import) [12:50:48.0812] > <@bradfordcsmith:matrix.org> Sorry, what would be the meaning of `export source ...`? `export source foo from 'path'` [12:50:54.0269] So I like the "break glass" mental model [12:51:27.0045] let isn't reserved in *strict* mode either btw [12:51:27.0182] > <@ljharb:matrix.org> `export source foo from 'path'` So, it's a way to re-export the source of some other module? [12:51:29.0815] I can see it now, someone writes a prettier or dprint rule to format code as `import .source x from "y"` so it looks less like an expression. [12:51:43.0974] > <@michaelficarra:matrix.org> what? we already ban `let` We really should also ban `from` as identifier in ES6 😅 [12:52:43.0004] and `as` [12:52:58.0235] `import { as as as } ....` [12:53:05.0700] > <@haxjs:matrix.org> We really should also ban `from` as identifier in ES6 😅 Nooo. I actually have a package that exports a function of that name. [12:53:11.0944] > <@haxjs:matrix.org> We really should also ban `from` as identifier in ES6 😅 * Nooo. I actually have a package that exports a function with that name. [12:54:11.0247] need stage 3 reviewers for `Promise.embiggen()` -- any volunteers? [12:54:25.0540] e.g., ```js import { from } from "@esfx/iterable-query"; const res = from([a, b, c]).filter(predicate).groupBy(keySelector).toArray(); ``` [12:54:39.0518] `Promise.source.from()` [12:55:00.0319] > <@rbuckton:matrix.org> Nooo. I actually have a package that exports a function with that name. I mean, `import {from} from module` might ok, but `import from from "from"` really a mess :P [12:55:35.0863] > <@softwarechris:matrix.org> need stage 3 reviewers for `Promise.embiggen()` -- any volunteers? do a formal call after this topic [12:56:03.0471] yeah, might not have time do it tomorrow [12:56:11.0407] * yeah, might not have time -- can do it tomorrow [12:56:46.0740] I mean, `in` is a pseudo-keyword in `for-in` (and an actual keyword) [13:01:15.0743] I mean, you don't need quorum to assign stage 3 reviewers [13:01:23.0665] doesn't hurt to ask [13:02:35.0187] quorum is not even a concept we have [13:02:51.0780] eh, we kind of do [13:03:19.0710] on the last meeting day, when people are trickling in in the morning, we often delay the meeting a few minutes until we reach quorum [13:03:22.0265] "consensus by locking everyone else out of the room" [13:03:33.0011] everyone is always late on Thursday morning [13:03:49.0251] too much drinking Wednesday night [13:04:51.0131] fair, quorum is not a process formalism we have, but it is a norm we operate by where we kinda know who the core stakeholders are and don't pull a fast one when they aren't present [13:12:18.0586] > <@shuyuguo:matrix.org> fair, quorum is not a process formalism we have, but it is a norm we operate by where we kinda know who the core stakeholders are and don't pull a fast one when they aren't present and this norm is enforced by, if the stakeholder is present at the next meeting, they can say, "hey, you pulled a fast one!" and it's kinda undone. But this process is very infrequently applied and definitely has a 1-meeting time limit. [13:13:17.0108] > <@softwarechris:matrix.org> need stage 3 reviewers for `Promise.embiggen()` -- any volunteers? Happy to do it… because I already did it. [13:32:50.0914] Can we add a continuation topic to the agenda for Array grouping? [13:33:07.0859] I can be backup presenter if needed, but I thought ljharb was going to present [14:00:43.0016] ah good call, i thought the overflow item was already there. the PR has been rebased so i'd love to present it [14:04:18.0794] How long do you need? We miscounted before so we may well run into the afternoon session. [14:09:09.0522] I think we should expect to go into the afternoon session. I don't want to be rushed in the source maps topic either. [14:09:26.0149] is it an important goal for others to avoid the afternoon session tomorrow? [14:25:19.0290] > <@robpalme:matrix.org> How long do you need? We miscounted before so we may well run into the afternoon session. ideally 2 minutes, realistically 15 is a good goal [14:28:33.0701] Let's say 15mins then. [14:54:10.0768] https://hackmd.io/d88UqzA8TFaKRdjY3t8vyQ schedule updated. please take a look and lmk if any concerns [14:55:20.0606] it would also be helpful to be prepared to present in the earlier part of the day, if we breeze through quickly [14:57:20.0234] LGTM, yeah this is a good conservative approximation so we don’t rush too much, but we might get through it in the morning 2023-05-18 [06:17:27.0845] I have an appointment immediately before the meeting today, and Eemeli is out as well, so there'll be no Mozilla representative for the first half hour or so. From the agenda, I don't think there's anything that needs our feedback, but please ping me if something comes up. [07:47:15.0596] aww the decimal item got removed [07:47:34.0995] I would not have added my async iterators item if I'd thought it would be the only thing on the fourth day [07:47:39.0351] the presenter is sick, unfortunately. I'm looking forward to it next meeting! [07:47:39.0815] I guess we have other stuff now though [07:47:45.0868] also source maps overflow is today [07:48:13.0804] if anyone has decimal feedback, it'd be good to take that asynchronously [07:57:28.0512] @room 3 mins to go! [07:58:57.0409] Morning conflict, be there after. [08:12:50.0007] `.bufferAhead(Infinity)` sounds like someone wanted `.toArray()` [08:15:15.0008] > <@bakkot:matrix.org> aww the decimal item got removed why removed? [08:15:29.0218] because the presenter is sick today [08:15:35.0879] > <@littledan:matrix.org> the presenter is sick, unfortunately. I'm looking forward to it next meeting! oh ... [08:16:52.0403] > <@littledan:matrix.org> if anyone has decimal feedback, it'd be good to take that asynchronously The current plan is decimal128 or bigdecimal? [08:17:27.0025] HE Shi-Jun: we don't have that decided yet [08:17:56.0190] The champion proposed decimal128, and using objects with methods rather than primitives with operator overloading [08:18:00.0077] (last meeting) [08:18:02.0539] but nothing is decided [08:18:24.0329] this choice was based on feedback from implementers about R&T [08:18:36.0015] it'd be great to hear feedback on these decisions between now and the next meeting [08:18:42.0967] * it'd be great to hear feedback on these proposals between now and the next meeting [08:20:14.0093] When we discussed it in wechat group, it seems people would prefer decimal128, with the assumption that it might have hardware support in the future. And if BigDecimal, some people might prefer Rational because it could cover more cases (at least theoretically? ) [08:20:44.0158] (I never understood why the conversation died down in the WeChat group I started for this outreach, and then there's this other group that I wasn't invited to...) [08:21:28.0806] (when we make subgroups of TC39, the general principle is that they're open to anyone in the committee who wants to join them) [08:22:14.0131] It's just my personal chat groups... [08:22:21.0725] who is "we" then? [08:22:31.0958] is it JSCIG or just your personal contacts? [08:23:31.0977] Many chinese programmers , some are also in JSCIG group, but last JSCIG meeting we don't have enough time to cover decimal topic. [08:23:45.0777] It seems like the transcriptionist is lagging far behind – and while the transcription seems accurate, it's far enough behind that it's very hard for me as a note-takers to keep track of what was said [08:24:07.0972] yes I'm seeing that as well (I refreshed the notes a couple times to check if the error was on my side) [08:24:18.0882] I wonder if it's that the presentation is too fast [08:29:19.0567] > <@littledan:matrix.org> (when we make subgroups of TC39, the general principle is that they're open to anyone in the committee who wants to join them) JSCIG meetings are open to anyone (check github.com/JSCIG/es-discuss/issues for meeting schedule). The only problem might be, we use only chinese in the meeting :-) [08:29:53.0915] heh, I definitely won't be able to participate in a meeting, but I can participate in a text chat [08:30:10.0036] but if it's a personal group that's fine, I don't need to be involved. [08:32:46.0088] littledan: I don't think there is any official TC39 wechat group... do we have such wechat group? [08:33:28.0394] well, I formed one in 2019 but I wasn't really able to generate much conversation (and now WeChat won't really let me log in). You were in it. [08:34:05.0550] maybe because I was writing in English? but I would've been fine if people chatted in Chinese there [08:35:53.0099] Oh, I find it. It's not have messages from March 2020. [08:36:30.0585] Never mind, this isn't so important; we can discuss it after plenary [08:37:25.0505] I think that's just the ordered semantics that Kevin is proposing? [08:37:50.0666] we don't need some extra method to have these semantics [08:40:06.0494] did i miss how you opt in/out of concurrency overall? is there an options bag or something? [08:40:30.0091] littledan: in response to your topic, yes, this is all going to have to abandon the async generator mental model [08:40:50.0857] > <@michaelficarra:matrix.org> littledan: in response to your topic, yes, this is all going to have to abandon the async generator mental model I do not see this as a bad thing for iterator helpers [08:41:07.0742] littledan: me either [08:41:38.0795] peetk: you just pull more than you need, and `bufferAhead` is a helper to do that for you [08:48:19.0313] Maybe I'm not thinking of a complex enough test case, but I think something like `ints.map(subtractTwo).map(timesFour)` [08:48:30.0561] bakkot: yes it can, let me explain [08:49:16.0687] If the returned promises settle in any order, we can add `cap` and `capOOO` methods to fix the settlement order, and rearrange the resolutions [08:51:33.0890] the queue doesn't seem to be advancing properly for me [08:53:16.0707] refreshing fixed it 🤷‍♂️ [08:55:15.0332] so -- just to clarify -- bufferAhead is the way to opt into concurrency? [08:55:58.0630] a limited for, yes [08:56:19.0061] the out-of-order bit is what we're talking about to enable it completely unrestricted [08:56:29.0278] * a limited form, yes [08:57:24.0919] you can also just call `next` as much as you want for unlimited concurrency manually [08:57:30.0658] right [08:57:32.0621] ok thank you! [08:57:39.0255] no problem [08:59:38.0746] async iterators in particular really don't feel like they need to be sequential to me [09:00:06.0350] when people do async stuff, they know that the default state of things is out-of-order and that there needs to be explicit coordination to bring order back [09:00:46.0189] idk Promise.all() keeps order [09:00:48.0368] I think it's a bit of a refactoring hazard if I have to change something to be async because I add a new call [09:00:53.0619] @Michael That’s not really true though. [09:02:46.0958] yeah it's doing explicit coordination, that's its job [09:02:57.0665] * yeah it's doing coordination, that's its job [09:03:38.0973] the "values being lost" thing is a core implication of anything concurrent _or_ parallel i think, don't think there's another choice [09:06:13.0477] like, you try to improve throughput or whatever by doing a larger-than-necessary amount of work at a time, so if you want to impose some kind of serialization of results after the fact you'll have to discard stuff [09:08:05.0011] yeah but we have effects and exceptions and you can't just roll those back [09:11:23.0802] Happy to join an async-iterator call [09:11:46.0660] same [09:12:00.0066] I’m willing to be part of the call as well. [09:13:56.0750] > <@shuyuguo:matrix.org> like, you try to improve throughput or whatever by doing a larger-than-necessary amount of work at a time, so if you want to impose some kind of serialization of results after the fact you'll have to discard stuff only if you are going to stop consuming results conditionally - if you want to consume everything you don't have to lose anything, e.g. `let results = Promise.allSettled(array.map(asyncMapper))` doesn't lose anything [09:14:45.0853] bakkot: yes, right, but i thought your point was that `filter` and `reduce` are fundamentally conditional consumption [09:15:20.0006] which i agree with, we shouldn't just do the embarrassingly parallel things [09:15:40.0188] iterator helpers are fundamentally conditional yeah [09:15:56.0377] but we could decide that this problem is bad enough that iterator helpers should not be the place for concurrency, and just make these work like generators [09:16:10.0264] and say you have to do something else for concurrency so that you don't lose values [09:16:15.0397] right, fair, and that's not my position [09:16:16.0187] not my preferred option but it is an option [09:16:32.0621] because i think losing-values is just a core part of the bargain for general concurrency [09:16:52.0461] (in an exception case) [09:30:17.0739] to elaborate on why `filter` is weird: let's say you do ``` let it = [1, 2].toAsync().filter(pred); it.next().then(console.log); it.next().then(console.log); ``` and let's sa your predicate returns `true` for the second call instantly, but takes a minute to finish for the first call. if you are trying to preserve order at all, you can't resolve _either_ promise until the first call settles, because if the first call settles with `true` then the first promise needs to get `{ done: false, value: 1 }` and if it settles with `false` then the first promise needs to get `{ done: false, value: 2 }`. the only way to get things earlier than that is to give up on order _entirely_, so that in the case your predicate returns `false` for `1` then the first line prints `{ done: true }` and the second prints `{ done: false, value: 2 }`. [09:31:23.0146] yes, good example, the done-ness signal further reinforces my mental model of iterators being inherently ordered things [09:31:41.0763] * to elaborate on why `filter` is weird: let's say you do ``` let it = [1, 2].toAsync().filter(pred); it.next().then(console.log); it.next().then(console.log); ``` and let's say your predicate returns `true` for the second call instantly, but takes a minute to finish for the first call. if you are trying to preserve order at all, you can't resolve _either_ promise until the first call settles, because if the first call settles with `true` then the first promise needs to get `{ done: false, value: 1 }` and if it settles with `false` then the first promise needs to get `{ done: false, value: 2 }`. the only way to get things earlier than that is to give up on order _entirely_, so that in the case your predicate returns `false` for `1` then the first line prints `{ done: true }` and the second prints `{ done: false, value: 2 }`. [09:32:06.0461] It seems `done` should be also a promise 😅 [09:33:43.0059] shu: I still don't think so. It doesn't mean that any iterator derived from this one will be done. It's just used as a signal to the consumer to not pull anymore. [09:34:38.0948] that strikes me as not the prevalent intuition [09:35:01.0222] and will be confusing for the majority programmer if we adopted it [09:36:17.0559] RxJS can make observables from async iterators, and also is async iterable [09:36:32.0453] and has `map` etc helpers which are obviously out of order [09:36:42.0399] * and has `map` etc helpers which are out of order [09:36:48.0051] I wonder how they handle this case [09:37:02.0133] anyway my understanding of async iterator helpers right now is to provide "data concurrent" algorithms on generic collections, via the iterator interface [09:37:29.0558] but in general, data parallel algorithms require chunking and need to know the collection size ahead of time to chunk [09:37:35.0552] I'm kind of inclined to say that if you want to give up on preserving order you should switch to a different thing which is not inherently ordered, i.e. observables [09:37:45.0313] I think having two sets of methods with an opt-in that moves you from in-order to out-of-order is a fair compromise here [09:37:55.0682] thus my suggestion for bufferAheadOOO(N) method to recover the collection size [09:38:05.0583] and lets you do full OOO concurrency [09:38:12.0341] yeah I think we're in agreement [09:38:44.0511] If we're going to have to sets of methods I would be inclined to just have differently-named methods on the same prototype [09:38:51.0323] now question: should the OoO prototype have a similar-named method that's a no-op? [09:39:07.0257] I don't know how the proposed `bufferAheadOOO` would work [09:39:42.0303] bakkot: no, switching is better, since you don't have to add OOO to 10 method calls in a chain, and you don't accidentally in-order after some OOO method [09:40:18.0759] bakkot: we should pair on a prototype impl to see if it would work [09:40:24.0551] yeah but if you're reading it you have to notice the call at the the start of the chain to see that this `.filter` is unlike other `.filter`s [09:40:31.0143] and if it gets passed around first that might be lost entirely [09:40:32.0163] seems bad [09:40:55.0394] that's the case for all data structures? [09:41:03.0932] virtual dispatch baby [09:41:25.0396] "async iterator" and "async iterator but the methods are unordered" doesn't seem like really a different data structure [09:41:35.0688] hm. so. also, how do you consume one of these? [09:41:39.0473] like in my `filter` example [09:41:42.0866] what's the thing you actually do with it [09:41:50.0824] it's a different monad [09:41:53.0207] you can't for-await over it because for-await stops at the first `done` [09:42:05.0919] ditto `forEach` etc [09:42:21.0253] * hm. so. also, how do you consume one of these out-of-order things? [09:42:31.0506] Confidence in the ability to use the alternative license affects Ecma's ability to attract work and expand scope - even though we know informally it's highly likely to be approved. It's a matter for Ecma's organizational development. I guess this is best discussed in the GA or ExeCom since it's not a TC39-specific thing. [09:43:11.0213] any explanation which requires the use of the word "monad" is inherently not suitable for actual users [09:43:17.0401] > <@bakkot:matrix.org> and has `map` etc helpers which are obviously out of order For rxjs flatMap is out of order, concatMap preserves order [09:44:19.0901] they renamed flatMap to mergeMap IIRC [09:44:23.0709] to make that clearer [09:44:42.0080] there is also switchMap [09:45:20.0450] Yeah which was flatMapLatest [09:45:21.0628] but yes there are several different notions of "out of order" for flatMap [09:47:54.0662] chairs: we need to revisit decorator metadata as well [09:48:01.0972] sorry I didn't notice it was not on the agenda [09:48:06.0706] * sorry I didn't notice it was not on the draft schedule [09:48:10.0828] should only take 5 minutes [09:48:18.0142] https://github.com/tc39/proposal-array-grouping/pull/47/files [09:48:56.0402] hold back `done: true` until all underlying iterator yields settle? [09:49:25.0475] again, we should try to actually implement this to tease out these details [09:52:23.0977] peetk: https://github.com/tc39/proposal-array-grouping/issues/51#issuecomment-1372786948 [09:52:30.0338] (sorry if that's the wrong handle to ping) [09:52:57.0968] (he means contiguous) [09:58:15.0077] you can't hold back anything without giving up on order entirely [09:58:23.0532] * you can't hold back anything without giving up on out-of-order entirely [09:58:48.0059] well, maybe you can hold back `done` but not worry about exceptions? [09:58:58.0510] anyway yes we can pair on it [10:00:09.0184] wait the holding back doesn't fix anything in my example [10:00:12.0692] with `filter` [10:01:15.0260] giving up on order in that case means: that the first promise settles second, and it settles with `{ done: true }`. that means for-await is never going to see the second promise at all. [10:01:25.0696] i.e. in my example it's already settling last, so there's nothing to hold back [10:03:53.0585] Who was the first Stage 3 reviewer? [10:04:00.0952] We had someone who MS will recruit from Safari, and someone else [10:05:34.0817] littledan: shu [10:05:50.0457] yes? [10:06:29.0345] oh [10:06:33.0154] yes, i'm the first reviewer [10:09:56.0755] Justin Ridgewell: you should open an issue on the repo just in case though [10:10:06.0569] Will do [10:11:01.0492] I read your comment like 10 times and I still don't get the issue. Did you mistype something? [10:13:56.0044] a question for practitioners who want to use decorators natively in browsers: do you want metadata to ship at the same time as the rest of the decorators proposal? [10:14:22.0001] pzuraq: metadata is now stage 3 [10:15:26.0540] maybe a different question: who wants to use decorators natively in browsers? [10:15:34.0649] Does creating a new metadata object really cause perf issue? [10:16:04.0386] HE Shi-Jun: doing it on every single class when most of them won't have any decorators seems like it would be a pretty high cost, yeah? [10:16:27.0035] I don't think it would be an actual perf issue by itself, but it wouldn't be free, and the benefit doesn't seem worth it [10:16:30.0745] Someone clicked past queue items; who expressed support? [10:16:35.0454] I think Shu was expressing support? [10:16:40.0190] or maybe this was the previous commenter [10:16:46.0313] yeah [10:16:46.0730] * or maybe this was the previous topic [10:16:49.0542] it was for the last item [10:16:53.0395] ah thanks [10:17:04.0425] > <@shuyuguo:matrix.org> a question for practitioners who want to use decorators natively in browsers: do you want metadata to ship at the same time as the rest of the decorators proposal? in general, anything that minimizes the support matrix for any set of features is a nicety [10:17:09.0883] shu: : typescript can generate decorators with runttime type information and people write libraries which use that at runtime [10:17:11.0211] for some reason [10:17:42.0684] > <@bakkot:matrix.org> shu: : typescript can generate decorators with runttime type information and people write libraries which use that at runtime not sure i follow [10:17:53.0070] oh [10:17:54.0674] sorry [10:17:59.0740] I did not read the question correctly [10:18:00.0979] ignore me [10:18:03.0506] ah [10:19:22.0430] I wish Natalie from Chrome security was still attending [10:20:50.0693] https://github.com/tc39/proposal-decorator-metadata/issues/15 [10:31:39.0871] Great meeting everyone! [10:33:04.0880] ``` let it = [1, 2].toAsync().ooo().filter(pred); it.next().then(console.log); it.next().then(console.log); ``` Suppose the first call to `pred` returns `false`, but takes longer than the second call, and the second call returns `true`. What behavior do you imagine for the two prints? [10:38:32.0407] https://github.com/tc39/Reflector/issues/450 looking for nominations for one or more individuals for TG3 Convenors/Chairs [12:07:21.0734] `{ done: false, value: 2 }` then `{ done: true, value: undefined }`? I don't see what's challenging about this case 2023-05-19 [12:28:44.0265] fyi: updated tests for Array grouping: https://github.com/tc39/test262/pull/3830 2023-05-23 [17:04:01.0626] Hey, any comments on the TG4 scope before I send it off to Ecma? https://gist.github.com/littledan/5f3736a50a40c610d6e864f33a75dcad [18:36:34.0924] MLS had indicated that we should review this at the next plenary and IS echoed the same. I didn't get the sense that it needed to be gated on plenary, but mentioning here in case I misunderstood. Nonetheless, I don't see why it couldn't be updated later, whether at plenary or beyond. [18:37:19.0768] Yeah, I will put it on the Reflector too [18:37:20.0848] I can't add comments to the gist -- how would you like to receive feedback ? [18:37:31.0482] You can’t? [18:37:35.0576] thanks for writing this up, btw! [18:37:41.0928] Anyway feedback here is good [18:37:54.0904] oh sorry -- I can add comments -- I was hoping for line number comments [18:38:07.0194] didn't notice comment box at bottom [04:10:49.0628] littledan: Would the plan be for the source-map spec to ultimately follow the same procedures as we have for ECMA-262 and ECMA-402, or for more authority to be delegated to its TG to control the spec? Or is it too early for such considerations? [04:23:25.0434] I’d like to discuss that among the group. I don’t know yet. I think source maps are a little more loosely connected to 262 than 402 and that could affect the process. 2023-05-26 [07:50:40.0135] bakkot: https://github.com/tc39/proposal-set-methods/issues/98? [09:17:32.0723] shu: yeah you're probably right [09:17:37.0169] will bring it to the next meeting [09:21:25.0431] ah great thanks [09:31:07.0620] feel free to just implement it that way and ship [09:31:16.0994] don't think changing this after the fact will be a problem [09:42:28.0071] we'll be a while yet, need to think through the fast paths 2023-05-30 [02:02:39.0432] I'm working on setting up an incubator call for the decimal proposal -- if you're interested in discussing things, please check out the Doodle: https://doodle.com/meeting/participate/id/dy9WKG6d I had initially set June 1 as the date of the call, but I've received some feedback saying this doesn't work. I added a bunch more dates to the Doodle, so hopefully we can find something that works for enough of us. [12:57:25.0564] these are all in the middle of the night for the west coast [13:25:07.0317] ljharb: there are some later options [13:25:55.0569] there's only 5 i see, ranging from 1am - 5am pacific [13:26:27.0708] there's a "next" button [13:26:53.0110] ohhhh snap, ok, i could have sworn doodle showed them all with a horizontal scrollbar [13:26:54.0304] thanks [13:28:34.0723] gotta change the UI to get promoted, right? [13:29:46.0048] i didn't know google bought doodle [16:13:20.0201] the 19th is a federal holiday in the US and the rest of that week is PLDI, so these options are not great... [16:16:23.0285] what was the reason for June 1 not working? 2023-05-31 [00:18:53.0181] it could have worked but I got some private feedback from a few (and public feedback from one) that it wouldn't work out [00:19:23.0974] > <@michaelficarra:matrix.org> the 19th is a federal holiday in the US and the rest of that week is PLDI, so these options are not great... I can add some more options. [00:28:58.0239] options added [15:29:38.0385] so if we were going to add a `Math.sum`, should it 1. take a single iterable argument and add its elements, or 2. take a variable number of arguments and add them all together? keeping in mind that `Math.min`/`max` work like the second option [15:30:10.0728] * so if we were going to add a `Math.sum`, should it 1. take a single iterable argument and add its elements, or 2. take a variable number of arguments and add them all together? 3. we should pick a different name to avoid this problem (`Math.sumFrom`?) keeping in mind that `Math.min`/`max` work like the second option plz vote with emojis [15:30:17.0127] * so if we were going to add a `Math.sum`, should it 1. take a single iterable argument and add its elements, or 2. take a variable number of arguments and add them all together? 3. we should pick a different name to avoid this problem (`Math.sumFrom`?) keeping in mind that `Math.min`/`max` work like the second option plz vote with emoji reacts [16:07:23.0096] `Math.sum(...iterable)` seems like a reasonable way to implement 1 using 2. SpiderMonkey already has special handling for `Math.min(...array)`. [16:07:30.0728] * `Math.sum(...iterable)` seems like a reasonable way to implement 1 using 2. SpiderMonkey already has special handling for `Math.min/max(...array)`. [16:10:01.0544] iain: unfortunately no engine I have on hand is able to handle `Math.max(...iterable)` when iterable has more than ~100k elements [16:11:20.0799] Ah, fair enough [16:11:40.0220] * iain: unfortunately no engine I have on hand is able to handle `Math.max(...iterable)` when iterable has more than ~70k elements [16:12:31.0923] which, a.) sometimes I do in fact have arrays with more than 100k elements and b.) and because I don't know those limits offhand I would not be willing to use the `...iterable` version with any array whose length is not very strictly bounded [16:12:41.0912] * which, a.) sometimes I do in fact have arrays with more than 100k elements and b.) because I don't know those limits offhand I would not be willing to use the `...iterable` version with any array whose length is not very strictly bounded [16:13:19.0069] * so if we were going to add a `Math.sum`, should it 1. take a single iterable argument and add its elements, or 2. take a variable number of arguments and add them all together? 3. we should pick a different name to avoid this problem (`Math.sumFrom`?) keeping in mind that `Math.min`/`max` work like the second option plz vote with emoji reacts [note they may be out of order because Element displays the most popular ones first] [16:37:10.0075] Yeah I'm sad about that. I mean, I like both at the same time - take a variable number of numbers-or-iterators, and sum all of them [16:37:26.0674] aka flatten the arguments array and then sum the result [16:38:46.0487] I’ve had the same problem with `splice`. [16:39:27.0330] Not that I’m suggesting that we add `Array.prototype.swap` or `Array.prototype.patch`, but [16:39:57.0299] I'll say that in most cases I find it a little annoying if something *only* takes an iterable versus taking N arguments, because when I'm hand-authoring I have to remember to add a wrapper. But for sum() it's not really a deal; if I'm invoking on some varaibles directly I can just... add them together instead. [16:40:52.0578] The other issue with taking a single iterable is when you have two iterables. JS doesn't have built-in chain to make that work. [16:40:54.0030] if only we'd thought to make `Math.max` throw if you passed it something non-primitive with a `Symbol.iterator` property... [16:41:02.0153] While argument spread handles it automatically [16:41:44.0658] > JS doesn't have built-in chain to make that work soon! `Iterator.from([iter1, iter2]).flatMap(x => x)` [16:42:22.0927] honestly that is making me want `Iterator.of` [16:42:25.0229] we should have that too [16:44:50.0720] really the problem here is coercing [16:44:53.0454] we should stop coercing things [16:45:10.0782] Ah, an `Iterator.from()` would do it, yeah [16:45:19.0538] and like it's trivial to write yourself, but still [16:45:39.0553] `Iterator.from` is in the stage 3 iterator helpers proposal [16:45:45.0307] nice [16:50:39.0815] I'm sure it's not web compatible, but I wonder how many authors we'd help by throwing for a max() argument with an iterator, letting them know they meant to spread it. [16:51:21.0644] yeah I'd love that [16:51:35.0377] but someone out there is relying on `Math.max([10])` giving them `10` [16:52:21.0802] i think coercing to string *or* to number is often fine, but our behavior where we'll coerce to string *then* to number is so weird and buggy [16:53:46.0856] I want to make a rule that we never coerce between primitives, at least [16:54:10.0293] also ideally never coerce Array [16:54:15.0939] yeah def [16:54:18.0198] * also ideally never coerce Array instances [16:54:30.0442] I will probably have a bit on the agenda next meeting about this [16:55:19.0657] Having to call `str()` or `int()` in Python hasn't killed me yet. [16:56:07.0916] also like `['a', 'b', 'c'].at('start') // 'a'` [16:56:10.0490] I hate that [16:56:12.0467] I know why it happens [16:56:16.0064] and it's consistent [16:56:18.0160] but I hate it so much [16:56:22.0395] lol [16:56:29.0456] is that a NaN->0 coercion? [16:56:32.0504] yes [16:56:35.0361] bleh [16:56:39.0190] which is the worst of all coercions [16:56:48.0597] and which we are at least starting to move away from [16:57:05.0706] `take` and `drop` in the iterator helpers proposal guard on `NaN` explicitly