15:21
<devsnek>
bterlson: forcing people to fill out attendance to get the meeting link? :P
15:21
<devsnek>
i like it
15:22
<brad4d>
I only noticed the request for RSVP on the reflector mtg 77 issue this morning
15:23
<brad4d>
I've "watched" the repo now to hopefully avoid that in future
15:23
<brad4d>
someone mentioned an "event calendar" on that same thread
15:23
<brad4d>
where is that? I don't see anything in the how-we-work repo
15:24
<devsnek>
brad4d: https://github.com/tc39/Reflector/issues/290
15:25
<brad4d>
thx
16:40
<rkirsling>
the link appears to be to edit the form itself and not to fill it out
16:44
<devsnek>
bterlson: how do i change my name to say (OpenJS Foundation) instead of (Guest)
16:53
<Bakkot>
devsnek do you not get an option to set your name when joining the meeting?
16:53
<devsnek>
I put in "Gus Caplan"
16:54
<devsnek>
it added the (Guest)
16:54
<devsnek>
> Ross Kirsling (Playstation) (Guest)
16:55
<ljharb>
i see some people with two "(Guest)"s
16:55
<ljharb>
and a few with none, including me, but i signed in as a guest
16:55
<ljharb>
chicoxyzzy: ooh, good move putting your notes abbreviations in your name
16:55
<devsnek>
you think its live account related?
16:55
<ljharb>
maybe
16:55
<rickbutton>
i did not sign in and i have (Guest) next to my name
16:58
<rkirsling>
I have Guest too
16:58
<rkirsling>
weird
16:58
<ljharb>
i left to change my name and now i'm sitting in the queue - i assume it's just manual?
16:59
<ljharb>
bterlson: ^
17:03
<ljharb>
am i the only one still waiting to get in?
17:03
<ljharb>
nvm, i'm in
17:04
<littledan>
For the meeting scheduling, could we move custom numeric literals to after records and tuples + symbol as weakmap keys?
17:04
<apaprocki>
How do you actually get into the video conf? (Assuming teams is up)
17:04
<littledan>
I'm worried the latter two topics could run over time, and I'm fine with that time being cannibalized from custom numeric literals
17:04
<littledan>
(btw if there's someplace else I should make this request, let me know)
17:05
<Bakkot>
apaprocki https://github.com/tc39/Reflector/issues/288 links a google form you fill out to get the link
17:05
<Bakkot>
and then you click the link
17:05
<apaprocki>
Hm yeah I did that but didn’t get a mail
17:05
<Bakkot>
it doesn't send you mail
17:05
<Bakkot>
it just has the link on the page that results from clicking submit
17:06
<apaprocki>
Ah ok must have sped through it
17:06
<Bakkot>
apaprocki dm'd
17:11
<shu>
that delegates info form has Thursday after Friday
17:11
<devsnek>
horrifying https://gc.gy/62970054.png
17:11
<shu>
jinx
17:11
<devsnek>
lol 3 seconds
17:13
<littledan>
BTW what do people think of replacing first name/last name on the forms with just "name" next time? Not all cultures have a first name/last name split
17:13
<littledan>
this is actually something I previously raised to Ecma as something we should also avoid in forms
17:13
<bradleymeck>
just name is easier to manage i think anyway
17:16
<brad4d>
+littledan I agree, let's just ask for "name"
17:16
<ljharb>
+1
17:17
<ljharb>
google "falsehoods programmers believe about names"; it's a great reference for those who haven't seen it :-)
17:18
<devsnek>
shout out to my friend whose legal name is er3in
17:20
<littledan>
what is this notify command?
17:21
<devsnek>
notify command?
17:21
<ljharb>
like the irc `/notify`?
17:23
<bterlson>
devsnek: can you tell me more? I've been researching this topic and it seems like most places don't let you have anything novel in names?
17:23
<bterlson>
I want to change my legal name to have a null character in the middle or a zwsp or something
17:23
<rkirsling>
is it 3 as in 'ayn?
17:24
<devsnek>
bterlson: born in the us. apparently her birth certificate was submitted on new years eve and not checked properly
17:24
<rkirsling>
omg
17:24
<drousso>
FYI, Microsoft Teams apparently has an option for "Turn off incoming video" if Microsoft Teams is eating your CPU/RAM for breakfast :)
17:25
<michaelficarra>
drousso: does that help?
17:25
<devsnek>
rkirsling: it was supposed to be silent but she goes by "erthreein"
17:25
<devsnek>
well pronounces it like that, still spells it er3in
17:25
<drousso>
michaelficarra it seems to have helped for me! but not sure if that was just circumstantial 😅
17:27
<devsnek>
it would be cool to get some stats on the github pages specs
17:27
<michaelficarra>
drousso: I am trying it now
17:27
<michaelficarra>
it would be nice to have "just show video for person speaking"
17:31
<drousso>
michaelficarra FWIW (and you probably see this too), you can still see their shared screen
17:35
<ystartsev>
do we have beginners in the room who would appreciate simplifications of topics that are discussed?
17:40
<mpcsh>
ystartsev: I'd be interested, what form are you thinking that would take?
17:40
<ystartsev>
I (and others who are willing) would translate what is being discussed in a beginner friendly way
17:41
<ystartsev>
clear up any definitions
17:41
<ystartsev>
etc.
17:41
<littledan>
I can't get the /notify command working in irccloud. Does it work for anyone else?
17:41
<ystartsev>
littledan: hm, not working for me either
17:41
<ljharb>
hm, maybe freenode disabled it
17:43
<littledan>
could the chairs recommend another way to contact them?
17:44
<mpcsh>
ystartsev: yeah speaking for me, that'd be really helpful
17:44
<ljharb>
(looking into it; it might be irccloud and not freenode; if so i'll take it up with them)
17:44
<ljharb>
turns out it's `/notice` not `/notify` (sorry if your IRC client makes this intrusive)
17:44
<mpcsh>
^
17:45
<ljharb>
littledan: in case you missed that - `/notice`
17:45
<mpcsh>
ljharb: could you post the slides from your status update in the notes?
17:45
<ljharb>
sure
17:45
<littledan>
ah, thanks!
17:46
<littledan>
yeah, that worked I think
17:48
<ryzokuken>
sffc: I made a slideshow for the rounding behaviour PR and added it to the agenda separately but if we get consensus about it right here, I suppose we could save some time?
17:49
<devsnek>
seems not weird to me
17:49
<Bakkot>
link for that issue: https://github.com/tc39/proposal-smart-unit-preferences/issues/10
17:52
<ryzokuken>
It only affects the default value behaviour on an edge case.
17:54
<ryzokuken>
sffc: littledan: thanks!
17:56
<mpcsh>
rwaldron: could you post the slides for the test262 status update in the notes?
18:13
<ystartsev>
mpcsh: i invited you to #tc39-beginners, i will try to do a constant stream in there
18:13
<mpcsh>
sweet! thank you!
18:14
<ystartsev>
anyone who wants to help people on board or whatever please feel free to join, also if you are new-ish or have definitions questions
18:20
<devsnek>
shu: strong agree with your comment there
18:22
<bnb>
can't hear waldemar at all
18:22
<ljharb>
is it just me, or is waldemar's audio garbled?
18:22
<shu>
was robotic
18:23
<leobalter>
same here
18:23
<michaelficarra>
whew, I thought it was just me at first
18:23
<devsnek>
that's how you know opus isn't being used
18:45
<Bakkot>
+1 waldemar
18:49
<haxjs>
Either side will surprise parts of people, so only syntax error could protect people
18:51
<ljharb>
the syntax error would probably surprise a lot more people than one of the choices, tho
18:53
<haxjs>
At least it will tell them it may be not behave like u think
18:54
<rkirsling>
sorry for the "proposer with weak opinion" bit :p
18:55
<Bakkot>
direct eval is enough of a power-user feature that I think we can not worry about people who are specifically intending to get direct eval with new syntax being surprised by it not working
18:55
<haxjs>
And eval?.() actually have no solid use cases. so we'd better ban it
18:57
<shu>
is there a PR or issue for this item? where is it on the agenda?
18:58
<haxjs>
@shu https://github.com/tc39/ecma262/issues/2062
18:58
<shu>
no, not that one
18:58
<shu>
the one leo is presenting right now
18:58
<michaelficarra>
shu: way at the bottom of the agenda
18:58
<michaelficarra>
https://github.com/tc39/ecma262/issues/2090
18:58
<shu>
ah thanks
18:58
<michaelficarra>
https://github.com/tc39/proposal-numeric-separator/issues/49
19:01
<michaelficarra>
what is the etiquette around muting someone who is making noise and doesn't seem to know they are unmuted?
19:03
<bterlson>
I mute aggressively, personally.
19:04
<bterlson>
anyone happier with teams this time around? There have been a few updates since last meeting...
19:05
<ljharb>
bterlson: the biggest problem for me is that (on iOS at least) it's impossible to change which 4 people i'm looking at. i can't hide "folks with no video" nor can i scoot it through the list
19:06
<haxjs>
Is there way to show the name of speaker in teams?
19:33
<leobalter>
bterlson: Teams are still going to town with the CPU usage if I use it as a native app on Mac OS
19:33
<leobalter>
I see myself forced to use the browser version, which is not problematic
19:48
<rkirsling>
let's see how Teams deals with me building JSC on the same machine
19:49
<rkirsling>
ystartsev: yeah you can say it continues from where the Berlin presentation left off, maybe?
19:54
<brad4d>
There some uncertainty in the last meeting regarding whether internal slots with non-primitive values pose a problem to avoid.
19:54
<brad4d>
Was some resolution reached around that?
19:55
<brad4d>
I believe someone said they would ask MM to present his views on this.
19:55
<brad4d>
but I didn't see that when I skimmed through the agenda.
19:55
<ystartsev>
brad4d: yes
19:56
<ystartsev>
there was, there are two items on the agenda related to this
19:56
<ystartsev>
"documenting intrinsics" and "specific intrinsics
19:56
<ystartsev>
i don't know if we will get to them
19:56
<ystartsev>
but the short story is that ses group dropped it's objection afaik
19:57
<brad4d>
do you mean "documenting invariants"?
19:57
<jridgewell>
There's a small write up on the Intl docs
19:57
<ystartsev>
gah
19:57
<ystartsev>
sorry
19:57
<ystartsev>
_invariants_ in both cases
19:57
<jridgewell>
https://github.com/tc39/proposal-intl-segmenter/issues/96#issuecomment-661008571
19:57
<brad4d>
shiny, thx for clarifying
19:58
<robpalme>
starting in 3 mins
20:07
<brad4d>
Does "NonOctal" specifically mean "starts with a 0, but isn't an octal?" rather than just "not an octal"?
20:07
<rkirsling>
brad4d: yeah
20:08
<devsnek>
its a very scary part of js
20:08
<rkirsling>
it's specifically when 8 or 9 pulls a switcheroo in an otherwise octal context
20:08
<rickbutton>
bterlson: mic might be accidentally unmuted
20:08
<rkirsling>
abbreviated "noctal"
20:08
<devsnek>
i'm excited that the rewrite of engine262 doesn't include legacy octals at all
20:08
<rkirsling>
(because it's catchy, I assume)
20:09
<rkirsling>
devsnek: doesn't that translate to "I'm excited that engine262 doesn't implement the whole spec" though
20:09
<devsnek>
annex b?
20:09
<Bakkot>
we have consensus to pull the non-regex/html comments part of annex B into the main spec
20:09
<Bakkot>
editors are just busy with other stuff
20:09
<devsnek>
if someone moves it out of annex b i will be very excited to implement it
20:09
<Bakkot>
there is so much editorial work to be done
20:10
<Bakkot>
ooh, I am excited for this presentation
20:10
<rkirsling>
devsnek: ahh okay
20:10
<rickbutton>
Bakkot: same!
20:10
<devsnek>
also excited for this pres
20:10
<rkirsling>
yay let's get cognitive
20:10
<rkirsling>
🧠
20:10
<shu>
i'm not used to using my brain on the job
20:10
<devsnek>
lol
20:12
<michaelficarra>
we've actually made a lot of progress reducing this "secret language" over the years lol, it used to be sooooo esoteric
20:12
<devsnek>
this is where we learn tc39 is a programming language design noob
20:13
<rkirsling>
michaelficarra: yeah I feel like those particular examples are at least "it means what you think it means"
20:13
<rkirsling>
:)
20:14
<michaelficarra>
to be clear, I'm not trying to say we don't have plenty of examples of "secret language" today, just that they used to be worse and more common
20:14
<Bakkot>
yeah
20:14
<Bakkot>
also we started writing them down: https://github.com/tc39/how-we-work/blob/HEAD/terminology.md
20:15
<shu>
"worth its own weight" is a general english idiom IME, right?
20:15
<rickbutton>
^ yes, but what "weight" means in this context is complicated
20:15
<michaelficarra>
I love this use of "viscosity"
20:15
<rickbutton>
(is my take)
20:16
<rkirsling>
michaelficarra: +1
20:16
<shu>
it is interesting that it's called viscosity instead of liquidity
20:16
<rkirsling>
heh, guess that's a question of vantage point
20:16
<devsnek>
shu: i guess its whether you're thinking of "worth the pros" vs "worth the cons"
20:17
<shu>
devsnek: right: https://en.wikipedia.org/wiki/Markedness
20:17
<rkirsling>
I guess JS tends to have a viscosity level resembling molasses
20:17
<ljharb>
lol i've found the opposite
20:18
<haxjs>
“ viscosity” is really a secret language itself
20:19
<devsnek>
js has the viscosity of helium
20:19
<Bakkot>
i would say I find it easier to make changes in small JS programs than in e.g. Java, but usually harder to make large changes
20:19
<shu>
oooh no CDN is a terrible acronym
20:19
<rkirsling>
oh noo it's an overload for CDN
20:19
<rickbutton>
Cognitive Delivery Network
20:19
<michaelficarra>
rkirsling: I can see it both ways, typed FP languages are really rigid, but they also guide your hand when refactoring
20:19
<Bakkot>
yeah that's basically my experience
20:19
<Bakkot>
not just FP
20:20
<rkirsling>
I wonder if I misunderstood the term then
20:20
<rkirsling>
vs. malleability / rigidity
20:20
<rickbutton>
yeah it depends on whether you define viscosity as "ease of making local changes" or "ease of making changes that satisfy some constraint, correctness, or type soundness, etc"
20:22
<michaelficarra>
omg I love the idea to enumerate our language design guidelines
20:22
<rkirsling>
michaelficarra: we've had the rationale repo for a long time, it's just been really hard to get off the ground
20:23
<shu>
michaelficarra: i'm skeptical of utility, because i don't think we can really whittle them down
20:24
<michaelficarra>
shu: it doesn't need to be 100%, just a "checklist" as Felienne puts it, of things we should consider
20:24
<rkirsling>
yeah, like "these are the battles one often needs to fight"
20:25
<rkirsling>
er like "the perspectives one would want to have arguments toward"
20:25
<rkirsling>
ohh wow I thought it was viscosity of *design*
20:26
<rkirsling>
not of *use*
20:26
<rkirsling>
my bad
20:27
<devsnek>
i love that this is called a "maneuver"
20:28
<ljharb>
ystartsev: "a double equals b"
20:28
<ljharb>
or "a triple equals b"
20:29
<michaelficarra>
"abstract equality" and "strict equality"
20:29
<ljharb>
"abstractly equal" and "strictly equal" don't roll off the tongue nearly as well to me :-p
20:30
<devsnek>
"equal" and "eichwal"
20:30
<michaelficarra>
I don't think the spec-internal names are any worse than "double/triple equals" lol
20:30
<haxjs>
triple equal actually not strict enough (+0, -0, NaN) :-)
20:30
<ljharb>
double/triple is how it's already colloquially spoken aloud
20:30
<ljharb>
devsnek: eichwal, wow
20:30
<michaelficarra>
haxjs: SameValue
20:30
<devsnek>
ljharb: i know i'm very proud
20:32
<rkirsling>
that's amazing
20:32
<haxjs>
I really hope we can have a Truely Strict equal ... maybe `a is b` which use `Object.is` semantic
20:32
<rkirsling>
eichwal would be == though, yeah?
20:33
<rickbutton>
"equal" and "typo: you forgot a =" operators
20:33
<rkirsling>
devsnek: also can you tweet that so that I can RT it without taking credit from you
20:34
<devsnek>
lol
20:36
<devsnek>
rkirsling: one sec, putting into drake meme format
20:36
<jridgewell>
Can we mute Caio?
20:37
<mpcsh>
is anyone else finding WH's language on this topic uncomfortably aggressive?
20:37
<bradleymeck>
can delegates not talk in #tc39-editor-group ?
20:38
<mpcsh>
I was not aware of that channel
20:38
<michaelficarra>
bradleymeck: I think you should be able to
20:38
<littledan>
mpcsh: Yes, I agree
20:38
<ystartsev>
I also agree
20:38
<mpcsh>
bradleymeck: oh sorry, I thought you were responding to me and saying that discussion was happening in that channel
20:39
<michaelficarra>
rickbutton: if I wanted to stop using `x == null`, would I start using `!!(x ?? !0)`?
20:39
<mpcsh>
"you've actually made it worse" was particularly unacceptable to me
20:40
<mpcsh>
ditto "[the definitions] are unusably fuzzy"
20:40
<rickbutton>
michaelficarra: `/null|undefined/.test(x)` is the only valid way going forward
20:41
<michaelficarra>
rickbutton: doesn't that fail for "null"?
20:41
<rickbutton>
yes :P i was joking
20:41
<bradleymeck>
michaelficarra: i don't appear to be able to mmm
20:42
<michaelficarra>
bradleymeck: I see you in there
20:42
<bradleymeck>
michaelficarra: can't send messages
20:42
<michaelficarra>
ooohh
20:42
<rickbutton>
our linter rules disable == in all cases, and our style guide suggests checking for null and undefined explicitly, but really the callee should only return one or the other, not both, and should be documented
20:43
<ljharb>
most common linter configs disable `==` except when it's `== null`, fwiw
20:43
<michaelficarra>
the only thing I use `==` for is `== null`
20:43
<rickbutton>
I don't really have a strong opinion either way, if I read `== null` i will know what it means
20:43
<ljharb>
put another way, i don't know any common linter configs that allow `==` for anything non-null
20:46
<haxjs>
really hope we fixed == as JS 1.2 :-P
20:50
<michaelficarra>
ljharb: how about "equal-equal" and "equal-equal-equal" for names?
20:50
<ljharb>
we shorten "2 and 2 and 2" to "2 cubed" so why not shorten those to double and triple :-p
20:51
<haxjs>
so we will face the typo problem for eq-eq and eq-eq-eq just like == vs === :-P
20:52
<rkirsling>
trying to pronounce eq-eq-eq reminds me of the Knights of Ni
20:52
<michaelficarra>
ljharb: "2 and 2 and 2" is 6
20:52
<ljharb>
oh lol sorry, wasn't paying full attention
20:53
<michaelficarra>
🙃
20:56
<ljharb>
robpalme: update the queue?
20:58
<Bakkot>
bradleymeck you had that proposal for `private` decls outside of class bodies, yeah?
20:59
<Bakkot>
is that still live?
20:59
<bradleymeck>
Bakkot: jridgewell I believe is still handling it
20:59
<Bakkot>
cool, same question to jridgewell
20:59
<bradleymeck>
i just wanted to find someone to do it
21:06
<shu>
whoa, new VariableEnvironment, hm
21:06
<Bakkot>
feel weird about that a bit
21:06
<shu>
very weird
21:06
<Bakkot>
would prefer disallowing `var` maybe
21:07
<devsnek>
just don't do anything with var
21:07
<shu>
any concerns with letting them hoist?
21:07
<jridgewell>
Yes, it's still alive
21:07
<devsnek>
ya just let it hoist
21:07
<Bakkot>
ehh... class is kind of a function boundary is the reason I assume
21:07
<jridgewell>
But waiting for Class Fields to land before I bring it back.
21:07
<shu>
the constructor is a function boundary
21:07
<shu>
the "static part" is also?
21:07
<shu>
i don't have that intuition in any sense
21:07
<devsnek>
same
21:08
<devsnek>
someone should get on the queue
21:08
<Bakkot>
I think that doesn't need to be solved at this stage
21:08
<Bakkot>
but worth bringing up if you care a bunch I guess
21:08
<Bakkot>
shu well it changes the scoping of `this`
21:08
<Bakkot>
which is a lot like being a function boundary
21:09
<devsnek>
this being different is also weird
21:09
<shu>
Bakkot: interesting, would need to stew on that
21:09
<shu>
Bakkot: that seems better solved to me as requiring to use class name itself, unbind this, so i can think of the static block as a run-once, well, block
21:09
<shu>
but maybe i'm missing something
21:10
<shu>
i suppose consistency with field initializers, but those are the odd ones out in my mind
21:10
<devsnek>
i don't get why those need `this` either
21:12
<Bakkot>
instances fields definitely do
21:12
<devsnek>
static field initializers
21:13
<ljharb>
it's nice to not have to repeat the class name
21:13
<devsnek>
within the context of static it is weird to bring `this` into it
21:13
<devsnek>
imo
21:13
<ljharb>
i'd prefer "class access expressions" over using `this` tho
21:13
<devsnek>
is that the uh
21:13
<devsnek>
`class.x` thing
21:13
<ljharb>
yeah
21:14
<devsnek>
+1 on that
21:14
<devsnek>
since that proposal exists i don't see a point in binding `this`
21:15
<ljharb>
it doesn't exist yet tho
21:15
<devsnek>
what doesn't exist yet
21:15
<Bakkot>
that proposal has not advanced
21:15
<Bakkot>
to stage 4
21:15
<devsnek>
yeah
21:15
<ljharb>
right. it's still stage 1 iirc
21:16
<ljharb>
if it was stage 4, then i'd have wanted static class fields to not have `this` available either
21:16
<devsnek>
i'm saying we should recognize the value of that here instead of hacking it in with `this`
21:16
<ljharb>
but since static class fields already bind the `this` i think it'd be very weird for static blocks not to
21:16
<bradleymeck>
class.this.* is > than class.*
21:16
<ljharb>
lol
21:16
<bradleymeck>
not even joking
21:16
<ljharb>
i don't understand
21:16
<devsnek>
isn't that just `class.*`
21:16
<haxjs>
what is class.this?
21:17
<ljharb>
`class.` is supposed to be a way to reference the current class constructor
21:17
<ljharb>
so like, `class C { static x() { return class.x === C.x; } } C.x() // true`
21:17
<ljharb>
you're suggesting `class.this.x`?
21:17
<haxjs>
I mean what is `class.this` , it should be `this` property on the class?
21:17
<bradleymeck>
devsnek: except it leaves space for any other meta-properties we may want
21:18
<ljharb>
`class.this` definitely should be the "this" property on the class
21:18
<ljharb>
bradleymeck: what else would we want tho? the class is the constructor, conceptually
21:18
<ljharb>
`class.#x` would work too, i assume
21:19
<bradleymeck>
decorator stuff, exposing other things that aren't obvious (heritage?)
21:19
<devsnek>
heritage is Object.getPrototypeOf(class)
21:19
<bradleymeck>
not if you don't use extends
21:20
<devsnek>
then its not real heritage
21:20
<devsnek>
and not our problem
21:20
<bradleymeck>
it still inherits XD
21:20
<bradleymeck>
we can argue about various possible futures, but if i got some time i could probably ramble on with ideas of things i might want to store
21:20
<devsnek>
if we want it to be static constructor why not just `static constructor`
21:21
<ljharb>
bradleymeck: `class.@decoratorStuff`
21:21
<devsnek>
oh i guess that overrides the constructor property
21:21
<devsnek>
sigh
21:21
<devsnek>
anyway if that's the goal it should be a lot clearer
21:22
<haxjs>
Could we use `static.x` syntax instead of `class.x` ?
21:23
<ljharb>
we could, but i don't see why that'd be clearer
21:23
<ljharb>
haxjs: what's the advantage to using `static.`?
21:23
<haxjs>
mapping to static declaration I think.
21:24
<shu>
rbuckton: maybe my concern can be addressed by simply changing the name of the feature to "static constructor"
21:24
<ljharb>
haxjs: worth filing on https://github.com/tc39/proposal-class-access-expressions
21:24
<shu>
and communicating it both inside and outside of committee using that, while keeping the block syntax
21:25
<devsnek>
using a function syntax would be interesting
21:26
<rbuckton>
shu: I named it based on its syntax, I was worried calling it `static constructor` would be possibly confusing because `static constructor () {}` is legal: https://usercontent.irccloud-cdn.com/file/tEbveTEq/image.png
21:27
<Bakkot>
this is one of the most arcane parts of the web platform
21:27
<Bakkot>
hope y'all are paying attention
21:27
<devsnek>
this is all i think about
21:28
<devsnek>
rbuckton: `static #constructor`?
21:28
<devsnek>
maybe too much magic
21:29
<haxjs>
@ljharb filed https://github.com/tc39/proposal-class-access-expressions/issues/3
21:29
<rbuckton>
Not a big fan of `static #constructor`, a lot to write, hard to remember, and too easy to do the wrong thing and forget the `#`
21:30
<ljharb>
haxjs: ty
21:30
<devsnek>
rbuckton: yeah idk, i would be on board with the static constructor idea if it was clearer that it was like a function
21:30
<Bakkot>
also static blocks have precedent in languages like e.g. Java
21:30
<Bakkot>
I prefer using the same syntax for things where it makes sense to do so
21:31
<devsnek>
like even if we did getter style syntax `static ( ) Block` sort of thing
21:31
<haxjs>
What will happen if have multiple static block?
21:31
<devsnek>
if its not a function i don't think it should do function things
21:31
<devsnek>
haxjs: i assumeearly error like multiple constructors
21:32
<Bakkot>
the presentation said early error
21:33
<haxjs>
Java seems allow multiple static block
21:33
<rbuckton>
The problem with `static.x` is that `static` isn't a reserved word, so we could break existing code.
21:33
<ljharb>
ah right
21:33
<haxjs>
rbuckton static is reserved word in strict mode, and class code is strict
21:34
<rbuckton>
```
21:34
<rbuckton>
let static = 1;
21:34
<rbuckton>
class C {
21:34
<rbuckton>
static {
21:34
<rbuckton>
static; // 1 or `this`?
21:34
<rbuckton>
}
21:34
<rbuckton>
}
21:34
<rbuckton>
```
21:34
<ljharb>
`static` by itself would be 1
21:34
<devsnek>
static in a class body is a reserved word
21:34
<ljharb>
but if `let static = { x: 1 };` then `static.x` would be the question
21:34
<Bakkot>
fwiw I like `this` a lot better than this new syntax
21:34
<ljharb>
devsnek: so `x = static.y;` is invalid?
21:35
<haxjs>
not valid in class
21:35
<devsnek>
ljharb: yes
21:35
<ljharb>
hm
21:35
<devsnek>
static is a reserved word in strict mode
21:35
<rbuckton>
I guess `static` is reserved in strict, but still it feels weird to reuse it.
21:35
<devsnek>
and class bodies are strict
21:35
<mpcsh>
how can we ensure that people use the queue? it's highly disruptive and burdensome on the notetakers when people interrupt a presentation for what should be entered as a clarifying question on the queue. WH has done this twice today, despite my earlier reminder to use the queue after the first instance.
21:35
<devsnek>
that being said
21:35
<devsnek>
i don't like using `static` for this
21:35
<devsnek>
+1 for `class`
21:35
<rbuckton>
Neither do I. I proposed `class.x` because there would be no ambiguity
21:36
<ljharb>
+1
21:37
<rbuckton>
Well, that's it for me this TC39, I won't be available for the rest of it. Thanks all
21:37
<bterlson>
rbuckton: thank you sir :)
21:38
<devsnek>
bradleymeck: could you bind the function constructor or eval with the first argument being the string
21:39
<wsdferdksl>
mpcsh: Please stop the personal attacks
21:41
<mpcsh>
wsdferdksl: (assuming this is Waldemar) I didn't realize you were on IRC, will send a DM
21:44
<devsnek>
shu: mark is saying if the base is null, delegate to the surrounding realm
21:46
<devsnek>
s/base/referencingScriptOrModule/
21:47
<shu>
devsnek: i understood mark as saying delegate to the [[Realm]] that the eval came from
21:47
<ryzokuken>
a second please
21:47
<bradleymeck>
devsnek: thats unclear as the behavior seems to call the hook with the execution context that is enqueueing the job
21:47
<devsnek>
an indirect eval should have the correct realm
21:48
<devsnek>
shu: that would be the active realm afaik
21:49
<shu>
devsnek: question is what if it itself doesn't have an active script?
21:49
<devsnek>
at that point it is html's problem right? you have a realm that came from some page
21:50
<devsnek>
the specificity is "the entire page"
21:52
<shu>
it's not html's problem
21:52
<shu>
i mean it is, but it needs JS to tell it when to do the capture
21:52
<shu>
which is what this is
21:52
<shu>
bradleymeck: i am pretty sure incumbents are not polyfillable
21:52
<devsnek>
given the active realm doesn't that give you the correct incumbent
21:52
<ljharb>
i wouldn't expect any host hook things to be polyfillable atm
21:52
<ljharb>
you can't polyfill the unhandled rejection hook either
21:53
<shu>
bradleymeck: the backup incumbent stack, that is, nor the active script check for dynamic import() base url
21:53
<shu>
bradleymeck: the question to you is why is that a goal?
21:53
<bradleymeck>
ljharb: the problem is that if you polyfill Promise.prototype.finally it won't match a native impl ever
21:53
<ljharb>
bradleymeck: that's already true, because of `await`
21:54
<ljharb>
well, i guess since it calls into a native `.then`, it'd work fine
21:54
<shu>
bradleymeck: that's a different problem, which is HTML's implementation of the hook isn't polyfillable, and therefore you can't polyfill a perfect replica of one integrated with HTML
21:54
<bradleymeck>
ljharb: it would be relative to the polyfill not the document from my understanding
21:54
<ljharb>
bradleymeck: but in a host where there's no unhandled rejection behavior, it's not possible to provide that behavior
21:54
<ljharb>
bradleymeck: oh sorry i'm talking about unhandled rejections; not this one
21:55
<ljharb>
bradleymeck: i'm trying to claim that it's not a reasonable expectation to be able to polyfill any host hook
21:55
<bradleymeck>
shu: sure, but i'm just coming from node's perspective not purely HTML
21:55
<bradleymeck>
and the behavior isn't necessarily problematic, but very unexpected
21:55
<bradleymeck>
and that makes me not want to move forward on my level of review for this meeting
21:56
<bradleymeck>
if it just errored instead of resolving against the user code that is acting like native code, that seems fine
21:56
<shu>
what errors? i am confused
21:56
<devsnek>
alright we have four minutes to push monads through
21:56
<shu>
like the proposal is to add a host hook that by default is a nop, not to add any specific behavior
21:57
<bradleymeck>
shu: correct, and I am unclear on why we would ever want to have the expected usage of the hook behavior
21:57
<bradleymeck>
the expected behavior seems to misalign with my expectations
21:57
<devsnek>
shu: i don't get why %eval%.[[Realm]] isn't the correct realm
21:57
<bradleymeck>
i do want to fix the code example, but the solution seems off
21:58
<shu>
bradleymeck: because the web already works this way for all web APIs, and firefox already works this way for Promises, and i want to reflect that reality in the spec instead of stringing together willful violations
21:58
<shu>
bradleymeck: i'm fairly confident there isn't a significantly cleaner way to layer this
21:58
<ryzokuken>
sorry for the technical issues, everyone. My computer seems to be really acting up today but I'm avoiding a restart because kernel updates 😅
21:58
<bradleymeck>
shu: I'd agree but I don't really want hosts to diverge here and thats what the hook is encouraging
21:58
<devsnek>
ryzokuken: was fine tbh
21:58
<ryzokuken>
devsnek: thanks
21:59
<ryzokuken>
also, i hate pulseaudio
21:59
<ryzokuken>
but yes
21:59
<bradleymeck>
shu: in part because, it is soo edge casey already, does it even need to be fixed?
22:00
<bradleymeck>
do newer web APIs even have this behavior or are we trying to align with what is considered bad practice these days
22:00
<shu>
bradleymeck: yes, if you use WebIDL you basically have this behavior
22:00
<shu>
bradleymeck: it needs to be fixed largely because HTML folks feel strongly that finalizers and promises should align with WebIDL here
22:00
<shu>
and i'd rather give them a clean point than willful violations
22:01
<shu>
firefox especially feels that finalizers and promises should track incumbents
22:01
<bradleymeck>
shu: i'm not really sure how user code or node could align with that
22:01
<shu>
bradleymeck: they don't, that's why it's a host hook
22:01
<shu>
full virtualizability is not a goal
22:01
<shu>
i understand you might desire that, but that's not true today
22:01
<bradleymeck>
shu: node doesn't need virtualizability
22:01
<shu>
sorry i was responding to the "how user code could align with that"
22:01
<bradleymeck>
shu: just the host itself seems to be against this pattern
22:02
<shu>
node COULD align with it by providing some privileged API that's like "capture incumbent"
22:02
<bradleymeck>
we have no such existing APIs, and that seems very odd to me
22:02
<shu>
do you have a rejection handler API, right?
22:02
<shu>
err, s/right//
22:02
<bradleymeck>
yes
22:03
<shu>
this would be along those lines if it was important to capture the backup incumbent stack behavior
22:03
<bradleymeck>
i don't understand that last sentence
22:04
<shu>
if it was important for node to capture the backup incumbent settings object stack behavior that HTML exhibits, then node could expose an API like "capture incumbent" and "restore incumbent" along the same lines of the already-provided rejection handler API
22:05
<bradleymeck>
i am unclear on what we need to capture, we already get the hook via the realm. I don't think stating everything related to "backup" + "incumbent" + (the settings object) is helping
22:06
<bradleymeck>
i'm familiar with settings and have some understanding of incumbent
22:06
<shu>
i tried to abstract all of that away with a notion of "some ambient state at the point of passing a callback to an API that eventually schedules the job" but that's even harder to talk about, i guess
22:06
<bradleymeck>
but none of this seems to align with my understanding of how this hook is supposed to enable a use case except for a very specific things for HTML and cause other hosts to have potentially drastic differences in how import() works
22:07
<shu>
ah, is that the actual concern, for import() divergence?
22:07
<bradleymeck>
shu: i think as long as we can align on what wouldn't cause node libs to require themselves to use privileged APIS and manage their own contexts it would be fine
22:07
<bradleymeck>
shu: yes
22:07
<bradleymeck>
i think mark's is around grabbing the data from the execution context itself
22:07
<bradleymeck>
which seems... bad to me
22:08
<bradleymeck>
but not fatal
22:08
<shu>
bradleymeck: do you have time to try to work through that right now?
22:08
<bradleymeck>
nope, gotta feed a kid
22:08
<shu>
k, let me schedule something for later then
22:08
<bradleymeck>
k
22:16
<shu>
devsnek: as for why eval's [[Realm]] wouldn't work, please read through the convoluted examples in https://html.spec.whatwg.org/#incumbent
22:17
<devsnek>
shu: I was looking through them, I don't get why it wouldn't
22:18
<shu>
the last one, with iframes
22:18
<shu>
you could schedule a Promise.resolve('import("whatever")').then(otherFrame.eval)
22:18
<shu>
the incumbent should still be yourself
22:20
<devsnek>
shu: I think the point was in that case it should be the other frame
22:21
<shu>
what do you mean "it should"?
22:21
<devsnek>
idk, a value judgement
22:21
<shu>
that behavior is not up for debate, it is what it is today
22:22
<devsnek>
only in firefox though right?
22:22
<shu>
no, for all web APIs (setTimeout) in all browsers, and for Promises only in Firefox
22:23
<shu>
so the question is, if we refuse to add these hooks to ecma262, there'll always be this corner case that makes Job-queuing APIs in ecma262 different from those that use WebIDL
22:24
<shu>
that's one outcome
22:24
<shu>
but there's no outcome where we, as tc39, can legislate the behavior away
22:24
<devsnek>
as long as promises observably stay the same, html can say they do additional things right?
22:25
<shu>
i don't understand what you mean by "observably stay the same"
22:26
<devsnek>
like can't it just say "insert this logic"
22:26
<devsnek>
that's not violating ecma262
22:26
<shu>
insert this logic in the middle of two algorithmic steps in a builtin?
22:26
<devsnek>
I guess something like that, yeah
22:27
<shu>
technically it can do whatever it wants, but myself, as a 262 editor, and the html editors, want a well understood, structured way to interface the specs
22:27
<shu>
thus host hooks
22:27
<shu>
this is not a question of expressivity. willful violations are also possible
22:27
<devsnek>
yeah it just seems like a very undesirable behaviour we wouldn't want to encourage
22:28
<devsnek>
I'm not expressly against the hooks
22:28
<shu>
i lament that we will intentionally create a harder to read document because of a lack of real argument
22:28
<shu>
i don't get this encouraging point
22:28
<shu>
you can almost do whatever you want with the module specifier right now
22:28
<shu>
but you weren't primed with that whatever's done right now is "weird and arcane"
22:29
<devsnek>
like within the design of the language you'd want the "context" to be determined by the eval, not where the string was written
22:29
<devsnek>
maybe that's what mark meant by dynamic scope
22:29
<shu>
that is what he's meant, but it's also not up to him or tc39 to decide, because that weirdness is already here with setTimeout
22:29
<shu>
or at least i also believe that's what he meant
22:29
<shu>
also it's not where the string is written, it's where the eval was passed
22:32
<devsnek>
theoretically what happens if js stuff determines the incumbent differently
22:32
<shu>
what does that mean, it provides a different default implementation than no-op?
22:33
<devsnek>
differently from setTimeout
22:33
<shu>
theoretically nothing happens because theoretically there is no default implementation of job scheduling and running
22:34
<devsnek>
I mean what if it works like not firefox
22:35
<shu>
then patterns like passing `postMessage.bind(whatever)` into Promise#then will behave differently from passing it into setTimeout
22:35
<shu>
a rare gotcha
22:35
<shu>
it is also possible that HTML and browsers decide, well, we'll just do the behavior anyways without host hooks
22:36
<shu>
in which case both will work the same but the specs will unfortunately obscure this fact
22:36
<devsnek>
you could say all new APIs do the active realm trick and timers are the exception
22:37
<shu>
but it's not just all setTimeout, it's *all* WebIDL that takes callbacks
22:37
<shu>
and you could say that, but does that serve the web dev better than aligning?
22:37
<shu>
i haven't heard a good argument that it does
22:37
<devsnek>
I guess I'm having trouble imagining when any of these options provide any use to a web dev anyway
22:39
<shu>
fair, but having complete interop semantics is the general strength of the web platform, and i'd like to keep that
22:42
<devsnek>
I assume the web breaks if you change webidl to use the builtin function's realm
22:42
<devsnek>
for everything
22:45
<shu>
that's the assumption