04:27 | <Jack Works> | fwiw i still think "does TC39 care about long-term unforking of vastly popular JS forks" is a pretty important problem for the ecosystem this is the only reasonable goal for me that might push this proposal forward, to unfork the fork but that also skeptical. Remember CoffeeJS? If TypeScript no longer popular like CoffeeJS used to? |
04:55 | <bakkot> | coffeescript, is maybe what you're thinking of? but that wasn't really a fork, it was just a different language which compiled to JS |
07:13 | <Ashley Claymore> | coffeescript did fork the community though. es2015 brought a lot of folk back to js |
07:15 | <Ashley Claymore> | I’m not sure if cs directly motivated any of the design of es2015. Maybe those who were involved will recall? |
07:18 | <Ashley Claymore> | Maybe the same happened with Java? Have recent versions been motivated by people’s adoption of Kotlin (Kotlin feels more like Java++ compared to other jvm languages like Scalar/Clojure that feel like entirely separate languages) |
07:25 | <legendecas> | That's right, so I think we should make friendly advice them to add. If they are added, we can be free from adding a bench of syntax that doesn't do anything |
12:09 | <annevk> |
Got that email from GitHub, but didn't really see anything explaining it |
12:11 | <annevk> | Oh, I think I see what it might be |
12:11 | <Luca Casonato> | Teams are being reorganized. No permission changes should have taken place |
12:12 | <Luca Casonato> | You are now in the Member: Mozilla team which is a child of the Delegates team |
13:54 | <Rob Palmer> | *** Plenary begins in 5 mins! *** |
14:12 | <bakkot> | I understand that the scope is "whatever is in CLDR" |
14:12 | <bakkot> | which is maybe not the best definition but does tend to be what most languages do, as I understand it |
14:13 | <Jack Works> |
|
14:13 | <Jack Works> | why not 👀 |
14:13 | <Jack Works> | otherwise people will bring their own ICU4JS |
14:13 | <sffc> | waldemar: the CLDR data file is at https://github.com/unicode-org/cldr/blob/main/common/supplemental/units.xml#L272 |
14:28 | <Michael Ficarra> | I don't disagree with Chip here, but if we wanted to have this discussion, it should've been a "discussion" topic on the agenda |
14:31 | <bakkot> | the point about person heights using different units depending on the actual height involved is a good one, I think |
14:31 | <bakkot> | hard to convey that properly in just a "what units are preferred" query |
14:32 | <shu> | the point about person heights using different units depending on the actual height involved is a good one, I think |
14:32 | <bakkot> | no they switch between "feet and inches" to just "inches" |
14:32 | <bakkot> | for heights under 3 feet |
14:32 | <bakkot> | in the US |
14:32 | <bakkot> | ... apparently |
14:32 | <shu> | fascinating, TIL |
14:33 | <sarahghp> | no they switch between "feet and inches" to just "inches" |
14:33 | <Michael Ficarra> | a lot of that data has ranges listed: road lengths are miles when long but feet when short |
14:34 | <shu> | ah yes that one is true |
14:34 | <yulia> | this makes me feel really weird |
14:34 | <Bradford Smith> | I would definitely be in favor of making TG2 more autonomous. I'm sure Chip and I are not the only people who tend to zone out during Intl proposal discussions. |
14:34 | <Michael Ficarra> | they also change the rounding precision: above 100 feet, round to the nearest 10, below round to the nearest 1 |
14:34 | <yulia> | i have blocked stage 1 on this, i just feel like he wasn't prepared |
14:34 | <bakkot> | wait yulia did you block stage 1 |
14:35 | <bakkot> | the notes do not say that |
14:35 | <yulia> | no |
14:35 | <yulia> | i feel bad that i didn't |
14:35 | <yulia> | the problem statement is what stage 1 is for |
14:35 | <Michael Ficarra> | yulia: plenary is not over |
14:35 | <shu> | i actually do not understand any more why 402 is not just a different body with a different process altogether |
14:35 | <yulia> | im not going to block, i understand that he won't have time to work on this if it isn't stage 1 |
14:36 | <bakkot> | shu: because we have not made it so |
14:36 | <bakkot> | but we could! |
14:36 | <shu> | seems to make more sense to tie their process closer to unicode cadence, have better liaising there |
14:36 | <yulia> | but it feels unfair to allow this to stage 1 when other proposals without problem statements are blocked on this |
14:36 | <bakkot> | but also a bunch of the work there is API design |
14:36 | <shu> | well why did they even end up in Ecma? |
14:36 | <yulia> | I would support intl having powers to advance up to stage 2 |
14:36 | <Michael Ficarra> | yulia: that sounds great |
14:36 | <Kris Kowal> | your invariants notion would help to that end |
14:37 | <Kris Kowal> | i think the only things we might have to comment on could be captured in invariants in general |
14:37 | <shu> | i guess there's no great non-web-biased body that standardizes JS APIs |
14:37 | <ryzokuken> | this however |
14:37 | <ryzokuken> | but also a bunch of the work there is API design |
14:37 | <bakkot> | I think we definitely would comment on the API design, even beyond invariants |
14:37 | <ryzokuken> | we benefit from the discussion in plenary around API design |
14:38 | <bakkot> | though, in practice we don't, much |
14:38 | <yulia> | your invariants notion would help to that end |
14:38 | <shu> | I think we definitely would comment on the API design, even beyond invariants |
14:38 | <jschoi> | i guess there's no great non-web-biased body that standardizes JS APIs |
14:38 | <bakkot> | well, that's on us |
14:38 | <shu> | i know, but unless people are going to start zoning in, or we own up to reality and cede that watchdog power? |
14:39 | <yulia> | i guess having the invariants written down would be a requirement, and that would reduce the level of review necessary |
14:39 | <yulia> | you would still need to review, but certain things would be a given |
14:40 | <ryzokuken> | the TG2 group is fairly honest at keeping ourselves up to the standards Zibi and Shane talked about |
14:40 | <Kris Kowal> | like, our experience so far is that limiting stage advancement powers to TG1 has not stopped weird API designs |
14:40 | <shu> | like i have no idea what is going on in this preso |
14:41 | <bakkot> | the thing going on in this presentaiton, as far as I can tell, is that there is a specific text format for templates which people want to use for messages which get formatted in different languages |
14:41 | <bakkot> | so the proposal is to bring in that parser and its corresponding template engine |
14:41 | <Michael Ficarra> | ryzokuken: the editor groups should collaborate more; frankly, I don't think 402 has the same editorial quality that 262 has |
14:42 | <shu> | this template format is further standardized/being standardized by Unicode? |
14:42 | <ryzokuken> | well, I'd be happy to fix that! |
14:42 | <bakkot> | yeah |
14:42 | <bakkot> | or |
14:42 | <bakkot> | by someone |
14:42 | <bakkot> | not sure by unicode |
14:42 | <Michael Ficarra> | I think Unicode |
14:42 | <ryzokuken> | ryzokuken: the editor groups should collaborate more; frankly, I don't think 402 has the same editorial quality that 262 has |
14:42 | <bakkot> | yes, unicode |
14:42 | <bakkot> | https://github.com/unicode-org/message-format-wg/ |
14:43 | <sffc> | yulia: I will work with Younies to make sure he addresses the concerns about the problem statement |
14:43 | <Michael Ficarra> | ryzokuken: the meetings are open access, please do! |
14:43 | <yulia> | sffc: thanks, that would be great |
14:44 | <bakkot> | this, in particular, seems like it should be a userland library, unless I'm missing something |
14:44 | <ryzokuken> | sure, though it's scheduled at a difficult time for me 😓 in the meantime, please feel free to file a bunch of editorial issues or just DM me here anytime. Richard has been making improvements in the last few weeks but I understand that there's still a bunch to be done. |
14:44 | <bakkot> | at least until it gets more common |
14:45 | <bakkot> | the format isn't even decided right now |
14:45 | <sffc> | I don't know how I feel about changing the TG2 process. I think it's working just fine the way it is. Intl is responsible for less than 10% of TG1 plenary time this meeting and in most meetings. |
14:45 | <shu> | i understood chip's point to mean that he'd like it to be 0 |
14:46 | <shu> | the format isn't even decided right now |
14:46 | <bakkot> | I guess that doesn't matter so much at this stage, to be fair |
14:48 | <ryzokuken> | Michael Ficarra: I don't have the necessary permissions to answer in that room |
14:48 | <sffc> | I have various concrete examples of how TG1 feedback has been valuable and shaped the direction of TG2 proposals, which would not have happened if proposals had advanced within TG2 alone. |
14:48 | <Michael Ficarra> | I do fear this might be a bit premature |
14:50 | <Bradford Smith> | Perhaps it would be sufficient to clearly divide scheduled plenary time between Ecma-262 and Ecma-402 proposals, so folks can skip parts they aren't interested in? |
14:50 | <ryzokuken> | I do fear this might be a bit premature |
14:51 | <sffc> | Bradford Smith: I think the draft schedule serves that purpose already... both of these proposals are moving forward at their scheduled times |
14:51 | <Bradford Smith> | sffc: We're pretty fast and loose about moving stuff around, during the meeting, though. |
14:52 | <bakkot> | is the problem statement for stage 1 "we want to format messages for internationalization" or "we want specifically the Unicode message formatter" |
14:52 | <bakkot> | because those have different motivations |
14:52 | <shu> | i understood the latter |
14:52 | <Michael Ficarra> | definitely seems like the latter, which is why I think it's probably premature |
14:53 | <bakkot> | honestly probably the latter seems more motivated but I'd want it to be, like, something lots of people are doing |
14:53 | <shu> | the repo has this sentence: "To help with this, we introduce Intl.MessageFormat as a native parser and formatter for MessageFormat 2.0." |
14:53 | <pzuraq> | another thing I might like to discuss if we get to decorators again on the agenda: https://github.com/tc39/proposal-decorators/issues/459 |
14:54 | <pzuraq> | should we make a decorators matrix room also? |
14:54 | <bakkot> | pzuraq: why would that not be allowed |
14:54 | <Bradford Smith> | sffc: Where is that draft schedule, anyway? The agenda doesn't say when the topics will be presented. |
14:54 | <bakkot> | Bradford Smith: it's linked from the reflector issue |
14:54 | <sffc> | [deleted] |
14:55 | <shu> | oh speaking of, bakkot, you're still planning to present the isStatic thing? |
14:55 | <bakkot> | yes |
14:55 | <pzuraq> | bakkot generally the syntax is pretty restricted, you can only do chaining of static property names ending in a call |
14:55 | <bakkot> | assuming chairs can find me a time for it |
14:55 | <Bradford Smith> | sffc: Ah, the thing that is labeled "Purely a guide, never a promise " :) |
14:56 | <pzuraq> |
|
14:56 | <Michael Ficarra> | sffc: please don't paste links from the reflector into Matrix |
14:57 | <sffc> | Michael Ficarra: sorry, I wasn't sure whether that link was okay or not |
14:57 | <pzuraq> | this decision on syntax was made prior to my taking on the proposal, so I'm not 100% sure what the context was, other than ASI hazards and such |
14:57 | <Michael Ficarra> | the draft schedule links to the notes docs... |
14:57 | <ptomato> | FWIW, "message" has a long precedent - it's been called "message" in gettext and its predecessors for decades https://www.gnu.org/software/gettext/manual/gettext.html |
14:58 | <shu> | why isn't that library called getmessage then? 🤔 |
14:58 | <ptomato> | collections of "messages" are called "message catalogs" in gettext, not sure if that also exists in Unicode |
14:58 | <Bradford Smith> | What I'm suggesting is something like "Day 2 is specifically for Intl proposals" |
14:59 | <shu> | bakkot: i think fundamentally, almost all things in Intl are library-y, because it's a really a library. the main driving factor from my POV for "it's worth it to ship in the language" has been "runtimes ship all this data anyway let's put it to good use", with "it'd be good to have a standard" with a secondary |
14:59 | <ptomato> | why isn't that library called catgets |
15:00 | <bakkot> | shu: that's fair but my point is that this proposal does not appear to contain any data |
15:00 | <bakkot> | just a parser |
15:00 | <bakkot> | and template engine |
15:00 | <bakkot> | and maybe I'm wrong about that |
15:00 | <nicolo-ribaudo> | sffc: please don't paste links from the reflector into Matrix |
15:00 | <Luca Casonato> | shu: that's fair but my point is that this proposal does not appear to contain any data |
15:00 | <shu> | how? |
15:00 | <bakkot> | yeah that's the part I'd like to understand more |
15:00 | <ptomato> | I have a reference on why it is not as simple as using a template engine, but I'll have to dig it up |
15:00 | <bakkot> | it looked to me like the formatters are just passed in |
15:00 | <Luca Casonato> | https://projectfluent.org/ explains this really well |
15:00 | <ptomato> | I'll open an issue in the proposal repo |
15:01 | <Luca Casonato> | For example in
The |
15:01 | <Romulo Cintra> | Some npm stats about i18n libraries https://www.npmtrends.com/fbt-vs-fluent-vs-format-message-vs-i18n-vs-i18next-vs-intl-messageformat-vs-messageformat-vs-polyglot-vs-react-intl-vs-react-i18next |
15:01 | <bakkot> | npm stats are not useful |
15:02 | <bakkot> | I refer you all again to https://www.npmjs.com/package/har-validator |
15:02 | <bakkot> | 20m downloads / week for a validator for https://github.com/ahmadnassri/har-spec |
15:03 | <Michael Ficarra> | bakkot: yeah most people spend most of their day validating HARs, do you not? |
15:03 | <Luca Casonato> |
In other languages, these aliases might be more complex. For example in polish, between "one" and "many", there is "few":
|
15:04 | <ryzokuken> | I think MessageFormat has the same justification as most Intl APIs but even more extreme: IIUC, it'd take a large amount of locale data in order to achieve this, which would be difficult to ship with a web bundle but could be shipped easily with a browser |
15:04 | <ryzokuken> | maybe the champions can correct me |
15:04 | <jschoi> | npm stats are not useful |
15:04 | <Luca Casonato> |
|
15:05 | <bakkot> | number of dependents on npm is more meaningful, if you want to look at stats, but that of course only brings in published packages |
15:07 | <bakkot> | another thing I might like to discuss if we get to decorators again on the agenda: https://github.com/tc39/proposal-decorators/issues/459 |
15:08 | <bakkot> | because I don't expect anyone to really care much |
15:08 | <pzuraq> | I guess would making a change like this require consensus at this point? |
15:09 | <bakkot> | yes |
15:09 | <bakkot> | all normative changes require consensus at this point |
15:09 | <jschoi> | This is a good catch. I strongly want @(expr)() class {} to be disallowed, like how the explainer says it would be, to make distinguishing decorators from the topic reference in x |> @(arg) still easy. |
15:09 | <bakkot> | unless the previous spec text was incoherent, which is kind of an edge case |
15:09 | <pzuraq> | well, we can talk about it this meeting or next then, there will likely be other small changes and tweaks to consider (e.g. the inclusion of private fields in decorator expression chains) |
15:10 | <pzuraq> | not a huge deal and I expect it to be uncontroversial |
15:11 | <pzuraq> | didn't realize that @ would be used in pipelines, I need to look at the latest on that proposal |
15:11 | <Michael Ficarra> | ... stabilize doesn't write to a property |
15:11 | <shu> | i thought it did for some objecs |
15:11 | <shu> | like arrays? |
15:11 | <jschoi> | We decided that at plenary just yesterday, so the explainer and spec haven’t been updated. Take a look at https://docs.google.com/presentation/d/1dDucwsW8qM22yWLr_NHFmAiAltQSht3AXYW00kET4GA/edit?usp=sharing. |
15:13 | <Michael Ficarra> | I think this proposal should've probably been incubated in TG3 before coming to plenary |
15:14 | <bakkot> | pzuraq: if you want to bring one or both of those up this meeting, should ask the chairs about it |
15:14 | <bakkot> | so far I have only asked for time for specifically the "isPrivate" thing |
15:15 | <pzuraq> | will do 👍️ |
15:20 | <yulia> | I can't speak sorry |
15:21 | <shu> | rob was wondering what you were +1ing since a lot was discussed |
15:22 | <yulia> | i believe it was your point on introducing a new integrity elvel |
15:23 | <bakkot> | i like read-only collections as a seperate thing from this proposal because they would just not have the relevant methods, rather than having them but they throw |
15:25 | <bakkot> | man, I wish any of my software "guarantees" were enforced by the hardware |
15:26 | <bakkot> | instead of being actively subverted by them |
15:26 | <shu> | my main confusion now is that IIUC this isn't an integrity level |
15:26 | <shu> | there are no guarantees |
15:26 | bakkot | shakes fist at spectre |
15:26 | <shu> | it seems to be just a new protocol with ad-hoc behavior for built-ins |
15:26 | <bterlson> | shu: if this wraps up early can we move your resizable buffers item to before lunch? |
15:26 | <shu> | happy to present sure |
15:27 | <bterlson> | shu: thank you sir, please get ready to present |
15:28 | <Michael Ficarra> | shu: I think I've been convinced that the stabilisation behaviour on different kinds of objects is too disparate |
15:28 | <bakkot> | I think instead of having a proper protocol for this I would want to have just a well-known symbol-named method |
15:28 | <bakkot> | so you can test for its presence |
15:29 | <bakkot> | also maybe not even symbol-named |
15:29 | <shu> | Michael Ficarra: yeah |
15:29 | <shu> | i don't get peter's point either |
15:29 | <bterlson> | pzuraq: would you be ready to do decorators continuation before lunch if needed |
15:29 | <shu> | there's no broad-stroke "is stabilized" guarantee he can rely on in this proposal to put things into ROM AFAIU |
15:29 | <shu> | you still have to understand what each object's stabilization does |
15:30 | <Michael Ficarra> | shu: I understand peter's perspective of trying to have a spec formalisation of something they already do, but I don't think it's simple and uniform enough to be considered one concept |
15:30 | <shu> | agreed, yes |
15:30 | <shu> | my actual fear is this: this will be become a popular exploit vector because it'll be brittle, tightly coupled to object representation, and lightly used and so doesn't get much hardening through heavy use |
15:31 | <pzuraq> | bterlson: yes |
15:32 | <Michael Ficarra> | this is going to be yet another proposal where we have a hard time agreeing on a problem statement |
15:33 | <shu> | how to make the language more confusing: here's a thing that's not freeze, but is the real freeze :( |
15:33 | <Michael Ficarra> | I guess I would say there's a need for unmodifiable variants of built-ins and we need to figure out how to provide that? |
15:34 | <shu> | isn't that the problem statement of the RO collections proposal? |
15:34 | <shu> | i'd say for this proposal, it broadens the problem statement to "all JS objects" |
15:34 | <shu> | which i doubt and disagree with |
15:34 | <Michael Ficarra> | then maybe we should ask them to work together? |
15:35 | <shu> | i think they already are, this is a fruit of that collaboration actually? |
15:35 | <bakkot> | they are working together, as I understand it |
15:35 | <bterlson> | pzuraq: please prepare to go with decorator continuation prior to lunch. shu you're off the hook til after lunch! |
15:35 | <shu> | bterlson: roger |
15:35 | <shu> | comic sans disengaged |
15:36 | <bterlson> | copy that v8 actual. Confirm garish colors are disarmed, over. |
15:36 | <bakkot> | freezing typed arrays, in particular, seems like the maximally bad case for Shu's usefulness-vs-engine-exploits tradeoff |
15:40 | <shu> | pzuraq: mind zooming in a bit? |
15:46 | <SoftwareChris> | re: w3c recommendation to avoid is prefix for booleans, does someone have a reference for that? |
15:47 | <bakkot> | https://w3ctag.github.io/design-principles/#naming-booleans |
15:49 | <SoftwareChris> |
|
15:51 | <HE Shi-Jun> | I'm little bit confused, does @(expr) already conflict with topic ref? |
15:51 | <nicolo-ribaudo> | Only in the
case because of ASI |
15:51 | <nicolo-ribaudo> | i.e. that wouldn't be a topic ref but a decorator |
15:52 | <HE Shi-Jun> | oh! so it introduced an ASI! 😭 |
15:53 | <HE Shi-Jun> | And only ASI in pipeline? oh my god... |
15:53 | <nicolo-ribaudo> | Just use semicolons 😛 |
15:53 | <HE Shi-Jun> | doesn't help |
15:54 | <HE Shi-Jun> | because when sb write @(expr) class B {} , very likely they mean decorator ... |
15:54 | <nicolo-ribaudo> | Yes, and it means the decorator |
15:55 | <nicolo-ribaudo> |
is the same as
|
15:55 | <HE Shi-Jun> | sorry i mean there is a newline between. |
15:55 | <nicolo-ribaudo> | It's like
is the same as
|
15:55 | <jschoi> | We are banning this by the way with a special early error. It must be parenthesized. Pipe bodies must not be unparenthesized decorated expressions. |
15:55 | <HE Shi-Jun> | oh. i c |
15:55 | <HE Shi-Jun> | sounds better |
15:56 | <nicolo-ribaudo> | We are banning this by the way with a special early error. It must be parenthesized. Like this?
? |
15:56 | <HE Shi-Jun> | though it make semi-less style even much harder... |
15:56 | <jschoi> |
|
15:56 | <jschoi> | (Also, developers should not be putting decorated expressions in pipe bodies anyway!) |
15:57 | <nicolo-ribaudo> | Yes. |
15:57 | <jschoi> | Also, a |> @(expr) class C {} would have been banned anyway.Because the pipe body doesn’t use the topic reference! Pipe bodies must use the topic at least once. |
15:58 | <jschoi> | But a |> @(@) class C {} could have been a hazard. So that’s why we have the extra error. |
15:58 | <nicolo-ribaudo> | Is this also banned?
|
15:58 | <bakkot> | oh jeeeeeze |
15:58 | <bakkot> | we have too much syntax |
15:58 | <jschoi> |
|
15:59 | <nicolo-ribaudo> | Yes, because the pipe body is an unparenthesized decorated expression. |
15:59 | <jschoi> | Oh wait, crap, missed that. It is not banned, and I think it is clear enough as two statements. |
15:59 | <HE Shi-Jun> | anyway, I really hope we could use @{foo} instead of @(foo) for decorator |
15:59 | <HE Shi-Jun> | it seems this will never confilict with topic ref |
15:59 | <nicolo-ribaudo> | That doesn't solve the asi hazard
|
15:59 | <Luca Casonato> | anyway, I really hope we could use @{foo} instead of @(foo) for decorator #[decorate()] a'la rust |
16:00 | <Michael Ficarra> | can we at least "NLT here"? |
16:00 | <nicolo-ribaudo> | In decorators? I have always written them with a line terminator before the class... |
16:00 | <HE Shi-Jun> | |
16:00 | <Michael Ficarra> | nicolo-ribaudo: no, after the @ |
16:01 | <HE Shi-Jun> | but now it's tuple :-) |
16:02 | <nicolo-ribaudo> | nicolo-ribaudo: no, after the @ (I disagree with that, but you might like it) |
16:02 | <HE Shi-Jun> |
|
16:02 | <jschoi> | They just talked about it. I believe the resolution is to allow @ blah class {} . |
16:02 | <nicolo-ribaudo> | Oh lol I was distracted |
16:03 | <Michael Ficarra> | I'm saying we could have "[no LineTerminator here]" to allow spaces but not newlines |
16:03 | <Michael Ficarra> | it's an option between allowing any whitespace and not allowing any whitespace at all |
16:03 | <HE Shi-Jun> | yes NLT! |
16:03 | <jschoi> | If we want an NLT, we had better make one more agenda item about this before plenary ends, haha…because otherwise it’s going to end without it. |
16:04 | <HE Shi-Jun> | we should... |
16:04 | <HE Shi-Jun> | it's really strange to allow LT after @ for decorator |
16:04 | <Michael Ficarra> | I guess I should've gotten on TCQ |
16:04 | <jschoi> | pzuraq: Some people still want an NLT after @ . Might want to make another agenda item? |
16:05 | <nicolo-ribaudo> | it's really strange to allow LT after @ for decorator |
16:05 | <pzuraq> | ok, happy to keep discussing it 👍 |
16:05 | <HE Shi-Jun> | Well, it's allowed almost everywhere |
16:08 | <Michael Ficarra> | I don't think anyone will object to it |
16:33 | <jschoi> | bakkot, Michael Ficarra: https://github.com/js-choi/proposal-function-memo I really wish WeakMaps supported primitives…It’d make specifying the cache’s behavior so much easier. |
16:35 | <jschoi> | I suppose we could just make it a Map (with argument-tuple keys?) and punt managing memory to the user…I wonder if an LRUMap might be worth adding to the language along with function-memo. |
16:38 | <pzuraq> | I would not mind an LRU cache at all |
16:43 | <Kris Kowal> | LRU, LFU, and ARC are useful in different scenarios, all of which can underly a Map implementation. I’d suggest that a memo/cache primitive should use a Map protocol, but not be coupled to a specific cache strategy. Even the choice between Map (memoize) and LruMap (cache) is meaningful. |
16:44 | <Kris Kowal> | Many years ago, I put together the {Lru,Lfu}{Map,Set} cross product e.g., http://www.collectionsjs.com/lru-map |
16:45 | <Kris Kowal> | All of which have a parameterizable key, which is something Map doesn’t do yet. |
16:46 | <jschoi> | Maybe we should tackle LRU/LFU Map/Set as a separate proposal, then. I’ll create something about this. Perhaps memo should require a map-like cache object as an argument—if we can’t do a WeakMap strategy by default, then it’s up to the developer to manage their memory. Though there are cases there people just use memoized functions to return a singleton from no arguments, and requiring a cache argument would make that clunky…… |
16:57 | <Rob Palmer> | *** Plenary restarts in 3 mins! *** |
17:01 | <Michael Ficarra> | bakkot, Michael Ficarra: https://github.com/js-choi/proposal-function-memo |
17:02 | <bakkot> | I will do some note taking |
17:02 | <bakkot> | yeah it's me |
17:02 | <bakkot> | I am at the computer the bot is running on, sorry for the confusion |
17:03 | <Michael Ficarra> | Many years ago, I put together the {Lru,Lfu}{Map,Set} cross product e.g., http://www.collectionsjs.com/lru-map |
17:05 | <danielrosenwasser> | Is 8x8 down? Having issues rejoining |
17:06 | <danielrosenwasser> | seems like a machine-specific issue, not sure why |
17:14 | <rbuckton> | on a related note, I want to bring a MultiMap proposal, any interest in co-championing? @esfx/equatable /@esfx/hashmap |
17:15 | <Michael Ficarra> | rbuckton: okay sure but I don't see how that's related |
17:16 | <Kris Kowal> | All that and mutation observers and we’d have a cocktail, but I’m no longer working in the context of a motivating use case. |
17:16 | <rbuckton> | More about time investment. I'd co-champion, but if I have free cycles for that I'd rather put them into something higher priority for me |
17:17 | <Kris Kowal> | I would want to prove it out in userspace. |
17:17 | <bakkot> | i mostly just want computeIfAbsent, which gets you 90% of the way to multimap |
17:17 | <Kris Kowal> | The one thing that would be super useful for proving it out in userspace would be records and tuples as keys. |
17:17 | <Michael Ficarra> | MultiMap is like Function.prototype.once for me, I write it in like 50+% of my projects |
17:18 | <jschoi> | The one thing that would be super useful for proving it out in userspace would be records and tuples as keys. |
17:18 | <jschoi> | Relatedly, if anyone is interested in co-championing https://github.com/js-choi/proposal-policy-map-set, then let me know. |
17:18 | <nicolo-ribaudo> | I'm having trouble with focusing on the notes, a third person would be appreciated because I feel almost unuseful |
17:18 | <rbuckton> | I also have @esfx/multimap , but it's based on my hashmap impl |
17:19 | <pzuraq> | Relatedly, if anyone is interested in co-championing https://github.com/js-choi/proposal-policy-map-set, then let me know. |
17:21 | <rbuckton> | I also have been tinkering with @esfx/collection-core which is a symbol-based protocol for abstracting collection operations that covers (with shims) Array, typed arrays, Map, Set, WeakMap, and WeakSet and is designed for the user-defined Map-like scenario. |
17:25 | <Kris Kowal> | The (with shims) was the design mistake I made for collections . |
17:25 | <Kris Kowal> | But largely the same idea: protocols all the way down. |
17:27 | <rbuckton> | The shims are optional |
17:27 | <Kris Kowal> | In any case, if folks are interested in investing in that approach in userspace, I’m sitting on both collections and @collections on npm and I’m easy to find. 👋 |
17:27 | <rbuckton> | (ie, in @esfx/collection-core-shim ) |
17:30 | <pzuraq> | I didn't realize ljharb wasn't in attendance today and apparently he is unhappy with the outcome surrounding private /static , should we revisit? |
17:31 | <ljharb> | I’ll be there tomorrow, I’m just on a plane right now. |
17:31 | <HE Shi-Jun> | It seems the queue is still in the last topic? |
17:34 | <Robin Ricard> | sorted |
17:38 | <Michael Ficarra> | you can use concat to do a non-mutating "push", right? |
17:38 | <nicolo-ribaudo> | Yes exactly |
17:38 | <nicolo-ribaudo> | That's why the number of methods was reduced from 10 to 4 |
17:38 | <nicolo-ribaudo> | (many were mostly duplicates) |
17:39 | <Michael Ficarra> | this is a really good proposal 👍️ and well presented |
17:42 | <jschoi> | pzuraq: FYI, might also want to talk about https://github.com/tc39/proposal-decorators/issues/460 during this plenary too. I am willing to reallocate holistic-dataflow time (currently 60 min) to more decorator stuff, because decorators are more urgent, having formally reached Stage 3. |
17:43 | <bakkot> | strong agree with MM |
17:43 | <jschoi> | pzuraq: Also https://github.com/tc39/proposal-decorators/issues/461. |
17:43 | <pzuraq> | yes, saw both of those pop up |
17:44 | <pzuraq> | happy to discuss |
17:44 | <shu> | haha does it really do that with undefined ? TIL |
17:44 | <Michael Ficarra> | bakkot: toSorted is as much a new method as it is an analogue of an old method, I think we're free to choose the less-bad precedent |
17:44 | <bakkot> | "new" versus "old" isn't a meaningful precedent |
17:44 | <bakkot> | users don't know that sort of thing |
17:45 | <Michael Ficarra> | why do users need to understand this method as "the same as .slice.sort() " and not just "it gives you a sorted copy"? |
17:45 | <pzuraq> | https://github.com/tc39/proposal-decorators/issues/204 might also be worth discussing, I thought this was in the previous versions of the spec I ported but I just double checked and it didn't seem to make it |
17:45 | <bakkot> | because what "sorted" means includes this behavior for holes |
17:45 | <Michael Ficarra> | it's not like there's some algebraic property we're trying to provide here |
17:46 | <bakkot> | right, so, the natural thing is to use the existing behavior rather than introducing a new, slightly different one |
17:47 | <Michael Ficarra> | users aren't going to run into this oddity, and when they do, I think they'd prefer the proposed behaviour because they won't know what the sort behaviour is (like shu) |
17:47 | <shu> | whoa whoa, slap to the face |
17:47 | <bakkot> | eh |
17:47 | <bakkot> | that's fair |
17:48 | <bakkot> | but in that case I'd also fix the undefined wart |
17:48 | <Michael Ficarra> | shu: I also didn't know how sort treated holes off the top of my head before this |
17:49 | <shu> | well, the actual hazard is somebody is doing .sort() in-place, then refactors to .toSorted() later |
17:49 | <shu> | and their input has holes or is weird in some way, and now they have a subtle difference |
17:49 | <ljharb> | the hazard being that their broken holey array gets fixed? |
17:50 | <ljharb> | holes are terrible and nobody should be relying on them |
17:50 | <shu> | i care about the likelihood of that, not as much the likelihood of users knowing the behavior of current sort |
17:50 | <rickbutton> | yeah the bug was having a holey array in the first place IMO |
17:50 | <shu> | "fixed" |
17:50 | <rickbutton> | but matter of perspective |
17:50 | <ljharb> | yes the way array spread and Array.from and the ES6+ array methods fixes it |
17:50 | <rickbutton> | we only like holy arrays, not holey arrays |
17:50 | <ljharb> | we’ve already decided to fix it whenever we can, in other places. That’s the precedent i hope we follow here. |
17:51 | <bakkot> | ljharb: sidebar, what's your objection to the private renaming |
17:51 | <bakkot> | I feel very strongly that isPrivate is wrong |
17:51 | <bakkot> | and would prefer we not fight about it on plenary time if we can avoid it |
17:52 | <ljharb> | wait, I’m confused |
17:52 | <ljharb> | which names did plenary decide on? |
17:52 | <bakkot> | as of today, "private" and "static" |
17:52 | <pzuraq> | private and static |
17:52 | <ljharb> | ohhhh ok then I’m happy with that |
17:52 | <ljharb> | i just misunderstood, sorry for the confusion |
17:52 | <bakkot> | ah, cool |
17:52 | <pzuraq> | all good 👍️ |
17:52 | <ljharb> | I’ll clarify my comment on that issue if i can find it |
17:53 | <bakkot> | yeah it got stage three with "isPrivate" and "isStatic" but no one had actually thought about it |
17:53 | <bakkot> | so we talked about it again today and changed to "private" and "static" |
17:53 | <ljharb> | i was under the impression it was already private/static :-) |
17:53 | <jschoi> | ohhhh ok then I’m happy with that |
17:53 | <bakkot> | aha |
17:55 | <bakkot> | this is a fair point from hax |
17:55 | <bakkot> | we already have some non-mutating methods without to |
17:56 | <bakkot> | and this behavior is not quite the same as spliced , since its return value is different |
17:57 | <ljharb> | (if we’re going to rename anything in the array method proposal I’d like to be present for that decision) |
18:01 | <nicolo-ribaudo> | Is there any problem with "remove species" other than backwards compatibility? |
18:02 | <nicolo-ribaudo> | (not in this proposal, from the proposal just to remove species) |
18:02 | <rickbutton> | i think just compat |
18:02 | <bakkot> | one problem is that it will make core-js add its very slow regex polyfill |
18:02 | <bakkot> | which isn't exactly a compat issue |
18:06 | <ljharb> | isn’t at all one |
18:06 | <ljharb> | and might incentivize people to update core-js |
18:06 | <bakkot> | haha, updating |
18:06 | <bakkot> | who updates things |
18:06 | <bakkot> | no one |
18:08 | <TabAtkins> | this dedenting problem (in HTML) is honestly one of the reasons I wrote Bikeshed. |
18:08 | <HE Shi-Jun> | splice() / toSpliced() is so bad. I would like to propose something like arr.replace(start, end, arr2) /toReplaced() which follow slice(start, end) . |
18:09 | <TabAtkins> | (before this, we did some horrifying comment hacks to allow <pre> to have indented text that looked reasonable in both source and output) |
18:11 | <Michael Ficarra> | hmm, trailing newline would be useful when writing files, for instance... |
18:12 | <Michael Ficarra> | the "character lines" don't need to be contiguous, right? |
18:13 | <Michael Ficarra> | are lines with only leading whitespace and an interpolation considered "character lines"? |
18:14 | <HE Shi-Jun> | are lines with only leading whitespace and an interpolation considered "character lines"? |
18:14 | <TabAtkins> | I assume they would be |
18:14 | <Michael Ficarra> | I think I would prefer them to be |
18:14 | <TabAtkins> | Like, I'd be incredibly surprised if they didn't count as character lines |
18:15 | <TabAtkins> | ($ is a non-ws character anyway, so should qualify ^_^) |
18:15 | <HE Shi-Jun> | oh u mean leading whitespace and ${...} ? |
18:16 | <TabAtkins> | yeah |
18:16 | <Michael Ficarra> | yes, that's an interpolation |
18:16 | <HE Shi-Jun> | I guess it should be char line... |
18:16 | <Michael Ficarra> | welp, question answered |
18:17 | <HE Shi-Jun> | oh, current slide give the anwser |
18:18 | <Michael Ficarra> | nice, template tag composition! |
18:19 | <bakkot> | note that this isn't possible for many tags |
18:19 | <TabAtkins> | oh this stacking is cute, hm |
18:19 | <bakkot> | but it happens to work for dedent, specifically |
18:19 | <bakkot> | that is, dedent composes with any tag |
18:19 | <bakkot> | but you can't generally compose arbitrary tags |
18:20 | <TabAtkins> | ""` gives me hives |
18:20 | <bakkot> | any syntax here gives me hives |
18:20 | <bakkot> | template tag ftw |
18:21 | <TabAtkins> | yeah def, they don't get that stacking behavior either |
18:21 | <Michael Ficarra> | extremely opposed to syntax for this |
18:21 | <TabAtkins> | well nm i guess they do |
18:21 | <TabAtkins> | anyway no need for syntax, eah |
18:21 | <yulia> | feeling overwhelmed by the @ s |
18:22 | <bakkot> | is erights in the chat |
18:22 | <bakkot> | I can probably explain how template tag composition works |
18:22 | <nicolo-ribaudo> | feeling overwhelmed by the # |
18:22 | <Kris Kowal> | generally, markm’s not in chat. |
18:22 | <bakkot> | alas. |
18:22 | <shu> | I can probably explain how template tag composition works |
18:22 | <Michael Ficarra> | the interpolated expression can have newlines in it, which might make things... weird, but shouldn't be a problem |
18:22 | <bakkot> | so, the key thing is, the interpolations don't participate in dedenting at all |
18:22 | <bakkot> | they are considered, basically, a placeholder character |
18:23 | <bakkot> | a non-newline placeholder character |
18:23 | <Michael Ficarra> | a ZWNJ |
18:23 | <shu> | bless you |
18:25 | <bakkot> | so basically you can imagine it as, replace all interpolations with a placeholder, do the logic as if it's just a string, then split it up again into a tagged-template-array argument |
18:26 | <shu> | i see |
18:26 | <shu> | in any case that seemed like not the actual question mark was asking |
18:26 | <bakkot> | yeah, whoops |
18:26 | <shu> | but your answer was to my question |
18:28 | <TabAtkins> | hmmmmm wonder if String.dedent({tabSize:4})`...mixed tabs and spaces content here` could work |
18:28 | <TabAtkins> | another branch in the call |
18:28 | <bakkot> | I'm going to propose another branch in the call also |
18:28 | <bakkot> | (for strings) |
18:28 | <bakkot> | so, fun all around |
18:28 | <Michael Ficarra> | I'm really hoping we can keep dedent simple and not parameterise it |
18:29 | <bakkot> | is python's parameterized |
18:29 | <bakkot> | I've never wanted that |
18:29 | <TabAtkins> | I find that mixed tabs and spaces are common in real text |
18:29 | <Michael Ficarra> | TabAtkins: what kinds of cursed codebases are you working in? |
18:29 | <bakkot> | TabAtkins: but in the common prefix? |
18:29 | <TabAtkins> | HTML, man |
18:29 | <TabAtkins> | and yes, in the common prefix |
18:29 | <bakkot> | I feel like even when mixed, the common prefix is not mixed |
18:29 | <bakkot> | well |
18:29 | <bakkot> | that sucks. |
18:29 | <shu> | wtf |
18:29 | <TabAtkins> | people indent like it's the wild west |
18:29 | <bakkot> | i want to not optimize for that case |
18:30 | <bakkot> | screw those people |
18:30 | <Michael Ficarra> | I don't know if I'd call that indentation at that point |
18:30 | <Michael Ficarra> | it's just... leading characters that happen to all be whitespace? |
18:30 | <TabAtkins> | listen, i'm with you, people treating tabs as fixed-width are the devil |
18:31 | <TabAtkins> | but i wrote code to handle this for a reason |
18:31 | <bakkot> | strong +1 to justin's point here |
18:31 | <bakkot> | I also indent the bodies of template tags |
18:31 | <bakkot> | everyone does afaik |
18:32 | <shu> | i... actually don't care about the format of the output, but i guess i'm in a small minority here |
18:32 | <Michael Ficarra> | I'm lazy. Unlike with other, simpler helpers, I do not write myself a dedent helper, I just align my template bodies at 0. |
18:32 | <jschoi> | YAML treats each tab equivalent to one space, I recall…? I forget what Python does. |
18:32 | <Michael Ficarra> | if I had a built-in dedent, I would gladly use it |
18:33 | <HE Shi-Jun> | YAML treats each tab equivalent to one space, I recall…? |
18:33 | <TabAtkins> | Python errors on mixed indentation for the same level. |
18:34 | <TabAtkins> | You can mix tabs and spaces, but have to use them consistently at a given level; it doesn't treat N spaces as equivalent to a tab |
18:34 | <jschoi> | yaml do not allow tab I think. |
18:35 | <jschoi> | That spec was the first parser I ever implemented (in Clojure)…Brings back memories. |
18:35 | <HE Shi-Jun> | You can mix tabs and spaces, but have to use them consistently at a given level; it doesn't treat N spaces as equivalent to a tab |
18:35 | <TabAtkins> | oh possibly, but by default it doesn't |
18:36 | <HE Shi-Jun> | It's really weird that comments could change the semantic of a code 😂 |
18:39 | <shu> | hahaha oh man |
18:40 | <shu> | if it treats strings as arraylike |
18:40 | <Michael Ficarra> | HE Shi-Jun: check out Haskell's pragmas |
18:40 | <TabAtkins> | I think I agree with bakkot here - the case i'm concerned about switching between a text var that needs dedenting, and inlining it into your code; the text var is likely gonna be formatted "normally" without empty first/last lines |
18:41 | <bakkot> | I like michael's proposal actually |
18:41 | <bakkot> | just so that we don't have this weird edge |
18:47 | <TabAtkins> | yeah i suppose String.proto.dedent omitting the first/last line behavior makes sense |
18:48 | <Michael Ficarra> | I just think it's a bit of a separate design space, so we should have separate functions so we don't feel obligated to make any less-than-ideal choices |
18:48 | <TabAtkins> | (The "have to detect this in the spec and error immediately" just continues to support my point that treating strings as iterables/array-likes is always a mistake that every lang just keeps repeating.) |
18:49 | <TabAtkins> | https://www.xanthir.com/b4wJ1 |
18:50 | <Michael Ficarra> | TabAtkins: unfortunately we don't have strings, we have sequences of UTF-16 code units |
18:50 | <bakkot> | they shouldn't be iterable anyway though |
18:50 | <Richard Gibson> | for iteration, they are sequences of code points |
18:50 | <Michael Ficarra> | the one that makes sense is an iteration over code units, though that's not what we chose |
18:51 | <bakkot> | that doesn't make sense either |
18:51 | <TabAtkins> | right, that's a mistake, it's always a mistake, exposing the internal impl of your strings as a default iteration is always wrong |
18:51 | <bakkot> | tab's essay makes an excellent case |
18:51 | <Michael Ficarra> | tab's essay makes an excellent case in a language where strings represent text |
18:51 | <Michael Ficarra> | we are not such a language |
18:52 | <Michael Ficarra> | we may as well have bytestrings |
18:52 | <jschoi> | Yes, strings should be abstract text; segmentation is situation-specific; even code points are the wrong default, because there should be no default. |
18:52 | <Michael Ficarra> | bytestring default iteration should be bytes |
18:52 | <bakkot> | "our strings don't represent text" is only true if you are using "represent" in an unusual way |
18:52 | <TabAtkins> | i don't understand how what i wrote is specific to "represents text"; alternatley, i don't know what sort of odd point you're trying to make about JS strings not being text (because, uh, what is "text" then?) |
18:52 | <bakkot> | because they absolutely do represent text in the usual, english-language meaning of the word |
18:52 | <TabAtkins> | If by "text" you mean "unicode codepoints", that's wrong. |
18:52 | <bakkot> | they just don't do it all that well |
18:53 | <TabAtkins> | codepoints aren't text, grapheme clusters aren't text, UCS2-ish code units aren't text, they're all impl strategies for storing text, a more abstract human concept. And all of them are interconvertable and wanted in different circumstances. |
18:54 | <TabAtkins> | but also my essay makes some points that aren't related to "text", such as the "infinite iteration regress" problem you have to handle explicitly when dealing with iterable strings, but virtually never with any other iterable |
18:54 | <bakkot> | syg: can you add the charted proposals to the notes |
18:54 | <shu> | link me notes in DM? |
18:55 | <bakkot> | done |
18:55 | <jschoi> | (I also would say that language APIs should never use the word “char” or “character”, which is a very ambiguous concept; instead it should always say “bytes”, “code units”, “code points”, “grapheme cluster”, or “text”/“strings”. And their operations should generally prefer acting on arbitrary “text”/“strings”.) |
18:55 | <Michael Ficarra> | codepoints are a representation of text, code units are a concrete way of storing and transmitting code points, and grapheme clusters are an artifact of rendering code points to be consumed as text |
18:56 | <TabAtkins> | you're still arguing at a level that doesn't actually impact any argument i'm making |
18:56 | <TabAtkins> | my essay isn't at any point about the theoretical purity of "text" or a type of string impl. it's all practicals. |
18:57 | <Michael Ficarra> | apparently we disagree on what a string is |
18:57 | <TabAtkins> | It doesn't matter. My essay stands for JS String values - every single argument there applies to them. |
18:58 | <Michael Ficarra> | no, that is what I am arguing against, it doesn't apply to JS string values |
18:58 | <TabAtkins> |
|
18:58 | <Michael Ficarra> | JS string values are in fact a collection, an ordered collection of two-byte ints |
18:59 | <bakkot> | but that fact is completely irrelevant to people's mental models |
18:59 | <Kris Kowal> | ^immutable |
18:59 | <Michael Ficarra> | it's completely relevant to how they work, mechanically, though |
18:59 | <TabAtkins> | Python strings are ordered collections of codepoints. That doesn't change the fact that set("foo") 's behavior is bizarre and unexpected |
18:59 | <Michael Ficarra> | JS string concatenation is not text concatenation |
18:59 | <jschoi> | A JS string value can be conceptually thought as simultaneously being several different collections, of several different kinds of elements, each on a different level of abstraction. |
18:59 | <bakkot> | so what |
19:00 | <bakkot> | why does "how they work, mechanically" dictate whether they participate in the iterator protocol |
19:00 | <bakkot> | or are indexable or whatever |
19:00 | <Michael Ficarra> | because when something actually does make sense to iterate in a specific way, you should be able to iterate it in that way by default? |
19:00 | <TabAtkins> | (rather, dictate how they work by default - there are lots of ways that strings can be iterable, and that's reasonable) |
19:01 | <bakkot> | my claim is that it does not actually make sense to iterate in that specific way |
19:01 | <Michael Ficarra> | there are not a lot of ways that JS strings can meaningfully be iterable though |
19:01 | <bakkot> | or at least does not make sense only in that way |
19:01 | <bakkot> | for the overwhelming majority of strings, yes there are |
19:01 | <Michael Ficarra> | I don't deal in overwhelming majorities, I talk about the whole class of strings |
19:01 | <bakkot> | strings which cannot be iterated as code units or grapheme clusters (with some particular locale) are vanishingly rare |
19:02 | <bakkot> | but users of the language do not |
19:02 | <bakkot> | the fact that some of the ways you might iterate have edge cases, and one in particular happens not to, does not mean the last way is the One True Way to iterate |
19:02 | <bakkot> | such that it should be blessed with the iteration protocol |
19:02 | <Michael Ficarra> | I gotta go eat lunch 🥪 |
19:03 | <TabAtkins> | basic point is: if you have a function that takes a parameter that's either iterable or not, and it iterates over the former case, you virtually never want strings to act like the former case. |
19:04 | <TabAtkins> | specifically: an n-ary func that can take its arguments separately or in an iterable |
19:04 | <bakkot> | (also, separately, if strings are considered to be a sequence of code units, then iterating should give you number values, not sequences-of-code-units-of-length-1) |
19:05 | <jschoi> | I think there was a place in the Unicode FAQs or Specification in which APIs were encouraged to focus on concatenation, interpolation, and other abstract-text operations…and avoid using indexing, segmentation, or counting by code units or code points where possible? I don’t remember exactly where. |
19:07 | <jschoi> | At the very least:
Text elements are very situation dependent; the user should ideally always explicitly specify what text elements they want—no default iterator. |
19:07 | <jschoi> | See also: counting how many “characters” are in a string. |
20:14 | <shu> | new incubator call charter is up: https://github.com/tc39/incubator-agendas/issues/24, please sign up for the decorator metadata discussion if you're interested |
20:15 | <jschoi> | shu: To be honest, I don’t remember what “precedence of async versions” precisely means again. If you don’t remember either, I can try digging back through the plenary notes. |
20:43 | <shu> | jschoi: it was something like "are we going to have async versions of all the methods?" the immediate response was no, we do it case-by-case |
20:44 | <shu> | so maybe the topic is something like, let's talk about what the criteria are for introducing async versions of existing methods |