06:46
<Rob Palmer>
The sign-in form is now on the Reflector issue. Please do not post the link here because this is a public channel.
06:51
<Rob Palmer>
Please could someone try the form to check it's working.
06:55
<ryzokuken>
Rob Palmer: just did
06:55
<legendecas>
I filled out the form and it works
06:55
<ryzokuken>
thanks legendecas!
08:52
<Rob Palmer>
There are 5 of us in the Jitsi call. We'll kick off in 8 mins!
08:58
<Rob Palmer>
13 people are here - two mins to go!
09:03
<Rob Palmer>
26 people now - and we are go
09:05
<Jack Works>
what is the password of the meeting?
09:05
<Rob Palmer>
use the form on the reflector
09:05
<Rob Palmer>
do not post the password here
09:05
<Jack Works>
oh ok thanks
09:30
<Rob Palmer>
40 people are here now - good turnout for 2am Pacific Time
09:31
<shu>
many folks missing affiliations in the names
09:33
<Aki>
anyone who just shows up as an email address probably has an 8x8 meet account
09:33
<Aki>
which doesn't support display names????
09:33
<bakkot>
Several of the people in the 8x8 don't have full names even
09:34
<Aki>
yeah i see that
09:35
<ryzokuken>
there's literally someone with test123 on here 😅
09:39
<yulia>
Aki: should we give an announcement about that? possible tighten the form so that if the name is not on the form they get booted?
09:39
<Aki>
Yup. that's my plan
09:40
<ryzokuken>
did we have local-only meetings in 2019?
09:44
<Aki>
we haven't had a local-only meeting in… idek 6 years?
09:45
<ryzokuken>
sounds good, I was just confused because they were mentioned in Istvan's report as "no longer on the table" but I thought they had been so for a while
09:51
<waldemar>
SDO = Standards Development Organization ☺
09:52
<yulia>
who wants to add SDO (syntax directed operation) to terminology? https://github.com/tc39/how-we-work/blob/master/terminology.md
09:52
<yulia>
we can add both definitions, i thought "standards development org" at first
09:54
<yulia>
Ashley Claymore volunteered
10:01
<Ashley Claymore>
https://github.com/tc39/how-we-work/pull/102/files
10:01
<Ashley Claymore>
Should I add 'standards development org' too?
10:01
<Ashley Claymore>
To avoid confusion
10:10
<yulia>
yeah, i think we use both in the tc39 context
10:10
<yulia>
for example "ecma is an SDO" for that context
10:13
<Ashley Claymore>
added both :)
10:14
<Rob Palmer>
We have 5 people with non-compliant Jitsi display names. Please can these people rename to use their full name and (affiliation/company) Waldemar, 393939, feng, Hongjian Yang, ZY
10:19
<Aki>
waldemar: psst (you're still missing the (Google) part
10:25
<leobalter>
I just catching up (was out of electricity here) but I'm happy to see the nominations for the Ecma award. Thanks yulia for coordinating this!
10:30
<bakkot>
Aki: speaking of scheduling stuff, Michael and I would like to defer the subclassing discussion to a later meeting
10:30
<Michael Ficarra>
we've already removed it from the agenda
10:31
<Aki>
no shit! WELL. that changes things.
10:31
<Michael Ficarra>
sorry, we should've given you a heads up
10:31
<Aki>
all good. i'm sure Ron Buckton will appreciate
10:31
<Michael Ficarra>
turns out subclassing builtins is a very complicated topic
10:32
<Aki>
imagine that
10:37
<Michael Ficarra>
can we advance the queue so I can add a reply?
10:38
<Aki>
done
10:49
<Michael Ficarra>
Jack Works: you're only looking to expose the composition of serialise/deserialise, not either individually, right?
10:53
<Jack Works>
Jack Works: you're only looking to expose the composition of serialise/deserialise, not either individually, right?
I'm looking for a much more powerful serialize/deserialize API in the language that can be integrated with structured clone
10:53
<Jack Works>
but I never presented it to the committe because I didn't make clear about how I should design those APIs
10:57
<Jack Works>

Design goals:

  • Format independent (I'm not going to specify a new format to store the serialize result)
  • Configurable (e.g.: Devs can define their own structures that can be stored into indexedDB via structured clone algr)
  • Async (Some data structures requires async access, including CryptoKey)
  • Exportable (a interesting property on CryptoKey)
  • Sendable (is it ok to transfer/clone to another Realm)
  • Transfer (as structured clone, transfered data cannot be accessed later)
10:58
<Michael Ficarra>
so it's going to be an opaque blob?
10:58
<Rob Palmer>
we are breaking for 62 mins. returning at 13:00 UK time
10:58
<Jack Works>
so it's going to be an opaque blob?
Yes, maybe. Host decides how to store them.
11:00
<Jack Works>

My current idea is

  • defining a new kind of intermediate data structure (let's call it InterMap) which works like a Map
  • design a set of API to ser/deser from/to InterMap
  • let InterMap can be structure cloned
11:02
<Michael Ficarra>
k, as long as you can't inspect it and rely on it
11:03
<Michael Ficarra>
though if you plan to have it able to be stored in IndexedDB, I don't see how you're going to do that
11:03
<Michael Ficarra>
will it still be opaque in IndexedDB?
11:07
<Jack Works>
will it still be opaque in IndexedDB?
yes, if you take it out from the indexedDB, you need to use the deserialize API (with the correct options) to extract data from it.
11:10
<Jack Works>

if A and B encode and decode the InterMap in different way, program will fail

e.g.

  • app that 1 month ago vs app today (via indexedDB or other persistent storage)
  • website a and website b (via postMessage or other communicating API))
11:58
<Rob Palmer>
We will be starting the meeting in 2 mins
12:09
<bakkot>
date.parse is never going to have agreement among engines I think
12:09
<shu>
exactly yes
12:13
<bakkot>
there was that one person (from Mozilla maybe?) a few years ago who was trying to come up with an intersection semantics but then they left and never came back
12:14
<shu>
yeah
12:14
<shu>
that convinced me it was a lost cause
12:14
<shu>
also a spectacular waste of engineer time
12:19
<Michael Ficarra>
why is this not an arrow?
12:20
<Michael Ficarra>
just so we can do cool point-free stuff?
12:21
<bakkot>
I don't think this counts as point-free, strictly speaking
12:21
<bakkot>
the ? is a point
12:21
<annevk>
The one thing I'd like to say on waste of time is that the number of engineers downstream from the specification is vastly larger and to some extent they also have to deal with engines disagreeing here. (I'm glad HTML parsing got solved eventually as that had similar sentiments attached to it.)
12:22
<HE Shi-Jun>
is f~() (without any ? or ...) valid syntax?
12:23
<leobalter>
Surma: Count me in for Stage 3 review of Module Blocks. I have direct interest for this feature and I need to get on the specs to make sure it connects well with ShadowRealms.
12:25
<leobalter>
I just can't guarantee I'm gonna be awake for the time you present it :)
12:26
<Surma>
That’s okay! I also have Guy Bedford volunteering to be a reviewer, and I don’t think they’re awake ;)
12:26
<shu>
annevk: fair, but in this case we have good agreement on the superior solution, Temporal
12:26
<HE Shi-Jun>
two placeholder .... oh
12:26
<shu>
such that there's no point in salvaging the old thing. i thought people are already shipping usertime libraries today instead of relying on the brokenness of Date.parse
12:28
<annevk>
shu: I'm not sure it needs salvaging; picking an implementation as winner seems preferable to implementation-defined behavior
12:28
<bakkot>
annevk: people switch on which engine they are running on before calling Date.parse sometimes, so I don't think we can even get away with that
12:31
<jschoi>
Sorry, where’s the queue link posted again?
12:31
<bakkot>
reflector
12:33
<jschoi>
I’m checking there, but I don’t see a queue link, sorry. What section is it under?
12:33
<bakkot>
https://github.com/tc39/Reflector/issues/396 under "TCQ"
12:33
<bakkot>
(that link will only work for delegates)
12:34
<jschoi>
Ah, sorry! I had not realized that was the acronym.
12:38
<Michael Ficarra>
legendecas: the downside of a.b~() being the only way to bind is that it only allows binding to an object the function is already installed on, not an arbitrary object
12:40
<leobalter>
I'm glad the to see the TCQ reflecting a lot of my thoughts already. For a big majority, the arrow function seems much easier to read. For constructors it feels lacking motivation and perhaps some weird way to sugar class inheritance.
12:41
<shu>
Michael Ficarra: compose it with comma expressions to first assign b to a, then delete it
12:44
<Rob Palmer>
shu: to your question on benefit over arrow functions: Benedict optimized bind to an inch of its life and ultimately made them faster than arrow functions (I believe). I wonder if this extra ability to bind arbitrary positions could eliminate the need for arrow functions so much, and therefore lead to possible performance wins.
12:45
<Michael Ficarra>
MM is making the exact point I wanted to make: readers are going to have a harder time with this, for basically no benefit
12:46
<shu>
Rob Palmer: i can see it being more optimizable, yes
12:46
<yulia>
I think arrow functions haven't been fully optimized yet if they are still slow. It isn't the syntax that causes this impact here. I wouldn't go with a performance argument for this
12:46
<shu>
but that is far, far below other considerations here
12:47
<yulia>
Rob Palmer: i can see it being more optimizable, yes
huh interesting
12:47
<shu>
it's easier to analyze, right?
12:47
<yulia>
right, i was thinking about a simpler case
12:47
<shu>
whereas for arrows that do simple forwarding + argument reordering/shuffling, you'd have to pattern match
12:47
<yulia>
yep yep, i didn't read fully -- sorry
12:47
<Rob Palmer>
creating an arrow function captures more scope (the execution context)
12:48
<shu>
it doesn't have to
12:48
<shu>
you could analyze more in the frontend if you really cared, i suppose, to pattern match on forwarding patterns
12:49
<shu>
but speculative optimizability is not compelling enough for this
12:49
<shu>
what are you doing such that you're creating so many forwarding functions?
12:50
<Rob Palmer>
glue. lots of glue.
12:51
<shu>
if the cost of glue is too high
12:51
<shu>
there might be avenues of exploration on a better bind here, than syntax
12:52
<ljharb>
+1 to a better bind (but "better" would require syntax imo)
12:52
<Michael Ficarra>
better would probably require syntax, yes
12:53
<shu>
i meant better only in terms of optimizability, i guess
12:53
<shu>
unless glue code writers also really care about how their glue code looks
12:53
<shu>
but i'm less sympathetic to that though
12:54
<bakkot>
i would be pretty surprised to see a JS codebase in which the difference in optimizability between arrows and .bind had a user-visible effect on performance
12:58
<jschoi>
To add onto Ron mentioning bind-this, PFA syntax and bind-this are orthogonal, would synergize, and have very small overlap. Examples in a moment.
12:59
<jschoi>

obj.method~() would handle method extraction with implicit binding, which bind-this does not address. I’m talking about when the receiver of the bound function already contains the function that is being bound. Bind-this would require you to repeat the receiver in this case; it does not address method extraction at all.

n.on("click", v.reset.bind(v))
n.on("click", v::v.reset)
n.on("click", v.reset~())
13:00
<jschoi>

Of course, PFA syntax does not address changing the receiver of a function call.

isPending.call(this._target())
this._target()::isPending()
13:00
<jschoi>

PFA syntax and bind-this can also work together, when creating bound functions with multiple partially applied arguments, which people sometimes do use bind for.
From svgo@1.2.2:

smartRound.bind(this, params.floatPrecision)
x => this::smartRound(params.floatPrecision, x)
this::smartRound~(params.floatPrecision, ?)
13:10
<shu>
gathering my thoughts some more: i can live with pipeline because, while i disagree with its motivations there as well (e.g. naming intermediates is too onerous), i have a sense that there is in fact a large number of folks clamoring for it and really want to type it. syntax catering to popularism is fine by me, active harm excepted. but here, i haven't gotten the sense there is a large number of folks clamoring for it
13:11
<rbuckton>
class C {}
function g() { return new C(); }
const o2 = g(); // C {}
const o3 = new g(); // C {}
13:12
<yulia>
gathering my thoughts some more: i can live with pipeline because, while i disagree with its motivations there as well (e.g. naming intermediates is too onerous), i have a sense that there is in fact a large number of folks clamoring for it and really want to type it. syntax catering to popularism is fine by me, active harm excepted. but here, i haven't gotten the sense there is a large number of folks clamoring for it
I feel like popular syntax has a life span, and pipeline creates a new way to write pretty much anything. So, i feel like it is much more risky than it appears. I really think we should be careful with pipeline. But there is clearly a broader issue here, which multiple proposals touch on, and it doesn't feel like it has been fully expressed yet.
13:15
<annevk>
bakkot: that's fair, but that's always a problem; I've seen it happen more than once that such cases end up getting overturned due to newer code (perhaps on other websites) relying on the behavior of a single browser. You cannot win with implementation-defined.
13:17
<sarahghp>
I feel like popular syntax has a life span, and pipeline creates a new way to write pretty much anything. So, i feel like it is much more risky than it appears. I really think we should be careful with pipeline. But there is clearly a broader issue here, which multiple proposals touch on, and it doesn't feel like it has been fully expressed yet.
The kind of code to which pipeline applies (temp variables to make a transformation tube) is very common. I don't think I've ever come across cases where partial application of a middle argument is necessary.
13:17
<waldemar>
rbuckton: g is an example of a function on which you get the same thing whether or not you invoke it with new. But most functions aren't like that: function F() {}; const o2 = F(); // undefined const o3 = new F(); // object
13:18
<rbuckton>
class C {}
function g() { return new C(); }
const o2 = g(); // C {}
const o3 = new g(); // C {}
This is not the same as new new Function()
13:18
<shu>
sarahghp: always good to hear a practitioner's take, thanks
13:18
<waldemar>
I know.
13:19
<rbuckton>
That was the point I was addressing though.
13:19
<waldemar>
We're still talking past each other,.
13:20
<waldemar>
If you wrap new so that it's invoked with a call, it makes no sense to new it again.
13:20
<waldemar>
We have no concept of a double-new.
13:22
<waldemar>
const g from the presentation should be only callable, not constructible.
13:22
<rbuckton>
My point was that the behavior is analogous to the function g() { return new C(); } example, above. Banning new g() seems strange to me, but I'm not opposed to that.
13:23
<rbuckton>
waldemar: I believe ljharb preferred the opposite, that a new C~() would require new at each call site.
13:23
<waldemar>
No because that function g does the same thing whether you new it or not. Use a function that does something different on new in the example.
13:23
<ljharb>
bound constructors require new at the callsite
13:23
<ljharb>
so that's the same thing i'd expect here
13:23
<rbuckton>
The approach I went with was to just do what function g() { return new C(); } does, in that calling new g() isn't valuable but doesn't break anything.
13:24
<Jack Works>
example code:
13:25
<Jack Works>
const x = module function f(a = expr()) {
}
13:25
<Jack Works>
although we know expr() must be evaluated in the new module, it's not clear on the syntax
13:26
<Jack Works>
because it didn't have a good visual separator { }
13:26
<rbuckton>

A partial application of new C~() would make the new part of the result, regardless as to whether C is a class or function:

function C() { }
function g() { return new C(); }
const o1 = g(); // C {}
const o2 = new g(); // C {}
13:27
<rbuckton>
The difference is between C~() and new C~().
13:30
<rbuckton>

if we don't have new in partial application, the behavior is the same as .bind:

function C() {}
const g = C~();
const o1 = g(); // undefined
const o2 = new g(); // C {}

However, not having new feels strange in this example:

class C {}
const g = C~(); // doesn't throw
const o1 = C(); // does throw, must use `new C()`
13:30
<Surma>
Process question: What do I do with reviewers? Do I have to collect/write them down somewhere?
13:30
<rbuckton>
They're usually added to the notes.
13:31
<ryzokuken>
Surma: you may include a list of reviewers to the explainer/README, that's something folks do
13:31
<ljharb>

if we don't have new in partial application, the behavior is the same as .bind:

function C() {}
const g = C~();
const o1 = g(); // undefined
const o2 = new g(); // C {}

However, not having new feels strange in this example:

class C {}
const g = C~(); // doesn't throw
const o1 = C(); // does throw, must use `new C()`
i don't find that example strange because you're not actually invoking C in line 2 (unless you're saying people will be confused by PFA syntax and think it's invoking a function). i think C() and g() should throw the same, though.
13:34
<Jack Works>
https://github.com/tc39/proposal-js-module-blocks/issues/45
13:36
<rbuckton>

I'm fine with have partial application without new (in the partial call), if necessary. I still feel that its unfortunate we don't have a built-in way to allocate a class instance via callback w/o having to defer to arrow functions. If we had Function.prototype.construct (to mirror Function.prototype.call/Reflect.construct) I might be less concerned with supporting new C~().
Something like:

Function.prototype.construct = function (...args) {
  return new this(...args);
};

class C {}
const o1 = C.construct(); // C {}
const g = C.construct~(); 
const o2 = g(); // C {}
13:37
<rbuckton>
But that suffers from the same problem as Function.prototype.bind: needing to rely on a method that could be patched at runtime.
13:37
<Surma>
Can someone tell me Guy Bedfords association? Or where I can look it up?
13:38
<nicolo-ribaudo>
I think Guy is an Invited Expert
13:41
<Surma>
Stage 3 reviewers PR here! If I missed anyone, please leave a comment :) Thanks to everyone who volunteered! https://github.com/tc39/proposal-js-module-blocks/pull/56
13:41
<Rob Palmer>
Guy is a delegate of OpenJS Foundation
13:45
<Michael Ficarra>
I have no normative comments for DurationFormat, but it does still need a bit of editorial work, which we can address during stage 3
13:48
<bterlson>
erights: welcome to the matrix
13:48
<erights>
(test please ignore)
13:48
<Jack Works>
Stage 3 reviewers PR here! If I missed anyone, please leave a comment :) Thanks to everyone who volunteered!

https://github.com/tc39/proposal-js-module-blocks/pull/56
Hi, can you add me too? And I think the sugar and issue 45 are two serious problem, we should not hurry to stage 3
13:50
<Surma>
THanks Jack Works. I’ll add you to the PR
13:52
<Surma>
Jack Works: Sorry, what’s your affiliation?
13:55
<Jack Works>
Jack Works: Sorry, what’s your affiliation?
Jack-Works on github
13:55
<HE Shi-Jun>
MM is making the exact point I wanted to make: readers are going to have a harder time with this, for basically no benefit
I'm not disagree MM, but IMO, hack style pipe have very similar problems. So...
13:55
<Jack Works>
I'm from Sujitech
13:57
<Michael Ficarra>
I'm not disagree MM, but IMO, hack style pipe have very similar problems. So...
Yeah I agree, but the pipe had so much community demand, we had to do something
14:03
<HE Shi-Jun>
gathering my thoughts some more: i can live with pipeline because, while i disagree with its motivations there as well (e.g. naming intermediates is too onerous), i have a sense that there is in fact a large number of folks clamoring for it and really want to type it. syntax catering to popularism is fine by me, active harm excepted. but here, i haven't gotten the sense there is a large number of folks clamoring for it
A very controversial questions: how "large number", and what's they really want? I have said many times, as my personal experience, most people who really like pipeline are come from fp community, and pipeline op in their mind === F# style pipeline, but we now go forward hack style...
14:05
<bakkot>
I just updated the conclusions for the various topics in the notes; presenters, please make sure I captured it accurately
14:08
<HE Shi-Jun>
The kind of code to which pipeline applies (temp variables to make a transformation tube) is very common. I don't think I've ever come across cases where partial application of a middle argument is necessary.
I'd like to say, if u don't need papp, you will very likely also not need hack style pipeline but only f# style pipeline :-)
14:08
<ljharb>
i don't need partial application, but i desperately need hack style pipeline, more than i need F# style
14:09
<ljharb>
(i could use all three for things, but "need" is different than "could use")
14:12
<sarahghp>
Yes, I think I am more in ljharb 's boat there as well.
14:12
<sarahghp>
It's rare I do PFA that bind would not suffice for.
14:13
<HE Shi-Jun>
Yeah I agree, but the pipe had so much community demand, we had to do something
Well I hope that would be "we had to do something which really match people real requirements"
14:17
<HE Shi-Jun>
i don't need partial application, but i desperately need hack style pipeline, more than i need F# style
This is quite strange, in 80% cases, hack style pipeline can be replaced by f# style + partial application.
14:17
<ljharb>
can't speak for everyone, but my real requirements are "be able to make nested function calls, some of whose arguments are non-simple expressions, left to right"
14:17
<ljharb>
what i mean is, i don't need what F# or PFA offers, but of course they can be used for what i need
14:17
<ljharb>
the smallest thing that does what i need tho is hack, and i don't have a need for PFA outside of that.
14:17
<rbuckton>
JavaScript straddles the fence between an OOP-style language and an FP-style language, without really being stellar at either. The partial application and pipeline proposals (in their various forms) have been trying to chip away at the FP-style side since 2018 to improve the language for those folks, similar to the decorators and public/private field proposals trying to chip away at the OOP-style side.
14:18
<shu>
HE Shi-Jun: polling is a hard problem. we'll never really have the resources to do scientific polling. if your question leads to "we should ignore developer signals because we don't have a good enough polling mechanism", that's not a position that reckons with reality
14:19
<shu>
so we do with the best we have, direct constituents we can poll (e.g. internal partners at our workplaces), anecdotes, compelling arguments from delegates, etc
14:19
<shu>
and the sense from those various sources is that there is enough demand for pipelines for us to do something, despite my personal reservations
14:20
<HE Shi-Jun>
the smallest thing that does what i need tho is hack, and i don't have a need for PFA outside of that.
so that's the point, u only want the part which just match your cases, but I don't think it's a good design choice, because separate f# + papp could have better orthogonality and composablity.
14:20
<sarahghp>
I guess — and I am being genuine here — I don't really see how PFA helps with the FP-"flavored" JS with which I am most familiar. The hard-core FP heads already are living their unary lives if the F# threads are to be believed and otherwise idiomatic JS is written so that arguments apply in order or are argument bags.
14:21
<ljharb>
HE Shi-Jun: to be clear, i'm not opposed to F# or PFA, in general or on the basis of "it's more than i need". i'm just pointing out that your assertion that someone who needs hack will also need PFA or F# is incorrect.
14:24
<shu>
zzz time
14:27
<HE Shi-Jun>
HE Shi-Jun: polling is a hard problem. we'll never really have the resources to do scientific polling. if your question leads to "we should ignore developer signals because we don't have a good enough polling mechanism", that's not a position that reckons with reality
Obviously I don't say ignore signals. I think everyone who attend the previous meetings should remember I explained many times I think pipeline requirements is very valid. My point is we should also not ignore the other part, especially pipeline op proposal, there are many conflicts in the repos and some are even locked by the champions. And I'm very worry about that what we as committee do on pipeline op, doesn't really solve the requirements of the developers.
14:28
<HE Shi-Jun>
But just "give people something".
16:30
<legendecas>
legendecas: the downside of a.b~() being the only way to bind is that it only allows binding to an object the function is already installed on, not an arbitrary object
thanks for the clarification! but doesn't that also indicate that we may have two ways to bind a method to object when bind operators also lands? that can be confusing for developers to choose in between.
16:33
<legendecas>
And they are both sugars for Function.prototype.bind with feature augmentations.
16:41
<jschoi>
And they are both sugars for Function.prototype.bind with feature augmentations.
I wouldn’t say that bind-this and PFA syntax overlap that much.
I wrote about this in https://github.com/js-choi/proposal-bind-this/blob/main/README.md#pfa-syntax. I also have a slide devoted to this in my upcoming presentation about bind-this.
16:42
<jschoi>

PFA syntax does not address the clunkiness of this:

// bluebird@3.5.5/js/release/synchronous_inspection.js
isPending.call(this._target())
this._target()::isPending()

…or this:

// ajv@6.10.0/lib/ajv.js
validate = macro.call(self, schema, parentSchema, it);
validate = self::macro(schema, parentSchema, it);
16:42
<jschoi>
Bind-this does not address fn.bind(null, ...args).
16:43
<jschoi>

At most they overlap somewhat when the receiver object itself contains the function to which we wish to bind. In that case, PFA syntax would be terser than bind-this, because bind-this would require repeating the receiver.

n.on("click", v.reset.bind(v)) // Note how v both contains v.reset and is the receiver of the function.
n.on("click", v::v.reset) // bind-this
n.on("click", v.reset~()) // PFA syntax
16:44
<jschoi>
But there are many cases in which it is not the case that you want to bind/call a function on an object that does not already contain that function. In fact, that may be the majority of uses of .call. And there are a lot of uses of .call: it’s one of the most frequently used JavaScript methods.
16:50
<legendecas>
This is a very detailed explanation, thanks! I'm very eager to see the progress of bind operator. However, I'm a bit concerned that several proposals are trying to do it in different directions and they all overlaps in one use case or another.
16:53
<jschoi>

That is understandable.
Do note that bind-this and PFA syntax could also work synergistically.

// svgo@1.2.2/plugins/convertTransform.js
smartRound.bind(this, params.floatPrecision) // Original
x => this::smartRound(params.floatPrecision, x) // bind-this only
this::smartRound~(params.floatPrecision, ?) // bind-this + PFA syntax

Anyways, I view PFA syntax and bind-this (and pipe operator) as pretty orthogonal. I understand Yulia’s desire to see if there’s a grand unifying syntax that could address all of the use cases, but I think the old bind operator kind of tried to do that and got stuck in the muck. bind-this, at least, tries to solve only one problem: .call/.bind are very common but are very clunky. Because of that, it can combine with PFA syntax or the pipe operator or whatever well.

17:05
<legendecas>
this::smartRound~(this, params.floatPrecision, ?) Sorry but I'm confused by this example. Why the first argument of ~() is been treated as this binding?
17:51
<shu>
HE Shi-Jun: i hear you, but we've been debating "which pipeline" on more principled grounds for years with no real progress
18:14
<Ashley Claymore>

IMO one nice little detail of hack pipes is that they can be slotted into the middle of a method call chain without changing any of the surrounding code

arr
  .map(f)
  .filter(g)
  |> customMethod(%) // added later
  .reduce(h, unit)
18:25
<jschoi>
Apologies; I made an error. It should indeed be this::smartRound~(params.floatPrecision, ?) to be equivalent to x => this::smartRound(params.floatPrecision, x). I have corrected my previous message.
19:42
<devsnek>

IMO one nice little detail of hack pipes is that they can be slotted into the middle of a method call chain without changing any of the surrounding code

arr
  .map(f)
  .filter(g)
  |> customMethod(%) // added later
  .reduce(h, unit)
the ambiguity on that method access is very scary
19:53
<ljharb>
how is it ambiguous?