Fixes #12965
https://github.com/vim/vim/pull/13221
(6 files)
—
Reply to this email directly, view it on GitHub.
You are receiving this because you are subscribed to this thread.![]()
Merging #13221 (af75efd) into master (02902b5) will decrease coverage by
5.42%.
The diff coverage is100.00%.
@@ Coverage Diff @@ ## master #13221 +/- ## ========================================== - Coverage 82.13% 76.71% -5.42% ========================================== Files 160 150 -10 Lines 195393 152556 -42837 Branches 43844 39340 -4504 ========================================== - Hits 160479 117035 -43444 - Misses 22074 23499 +1425 + Partials 12840 12022 -818
| Flag | Coverage Δ | |
|---|---|---|
| huge-clang-Array | ? |
|
| linux | ? |
|
| mingw-x64-HUGE | 76.71% <100.00%> (-0.01%) |
⬇️ |
| mingw-x86-HUGE | ? |
|
| windows | 76.71% <100.00%> (-1.59%) |
⬇️ |
Flags with carried forward coverage won't be shown. Click here to find out more.
| Files | Coverage Δ | |
|---|---|---|
| src/vim9class.c | 88.84% <100.00%> (-2.06%) |
⬇️ |
| src/vim9type.c | 90.20% <100.00%> (-0.13%) |
⬇️ |
... and 154 files with indirect coverage changes
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.![]()
what is contr-variant?
—
Reply to this email directly, view it on GitHub.
You are receiving this because you are subscribed to this thread.![]()
I was curious about that too, as I didn't understand what it was about at all.
Here's what wikipedia says:
Covariance and contravariance (computer science)
And this is what I was able to find on Dart
Dart and covariant
But if you, @yegappan , could explain it in your own words, it would be much better.
—
Reply to this email directly, view it on GitHub.
You are receiving this because you are subscribed to this thread.![]()
what is contr-variant?
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.![]()
@yegappan pushed 1 commit.
—
View it on GitHub or unsubscribe.
You are receiving this because you are subscribed to this thread.![]()
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.![]()
—
Reply to this email directly, view it on GitHub.
You are receiving this because you commented.![]()
Shades of Java's PECS.
There were two ways to deal with #12965.
Doing 1. is backwards compatible with future implementation of the requested features.
Doing 2. seems rushed.
My first look, not running any code, this change seems to add little, at the expense of conceptual complexity. I was in the process of manually working through some things related to this, so I could make a comment, when it got checked in (seemed pretty quick for a change that wasn't understood).
What's to rush to add new features that have not been debated?
—
Reply to this email directly, view it on GitHub.
You are receiving this because you commented.![]()
Shades of
Java'sPECS.There were two ways to deal with #12965.
- Adjust the parser to meet the spec.
- Change the spec and various implementation things.
Doing 1. is backwards compatible with future implementation of the requested features.
Doing 2. seems rushed.My first look, not running any code, this change seems to add little, at the expense of conceptual complexity. I was in the process of manually working through some things related to this, so I could make a comment, when it got checked in (seemed pretty quick for a change that wasn't understood).
What's to rush to add new features that have not been debated?
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.![]()
Shades of Java's PECS.
There were two ways to deal with #12965
1. Adjust the parser to meet the spec.
The spec currently states that:
Object methods of the base class can be overruled. The signature (arguments,
argument types and return type) must be exactly the same.The current implementation doesn't match with this spec.
Right, I mentioned that and one option was to meet the spec. With this change,
even with the rewording of the spec, it can be argued (but not definitively)
that the changed spec is violated. Note the original spec says
Object methods of the base class can be overruled. The signature (arguments,
argument types and return type) must be exactly the same. The method of the
base class can be called by prefixing "super.".
The new spec still has the prefixing "super." phrase.
When I read base class can be called by prefixing "super.", in the context
of The signature ... must be exactly the same, it`s easy to interpret this
as meaning, using the current example, that
class Bar extends Foo
def Doit(p: B): B
return super.Doit(p)
enddef
endclass
will compile and run OK. But if covariant and/or contravariant types are used
you'll easily get compile or runtime error, if super. is used in this fashion.
If we follow this spec,
then the type in an overruled method cannot be a covariant or
contra-variant.
I think that will be limiting, as the method in an extended class may want
to return
a covariant type.
I strongly agree that a method may want to return a covariant type.
Nothing in the previous spec (before this change) prevents returning a
covariant type. In fact, in the following example notice the output
object<C>
object<C>
Both Foo.Doit and Bar.Doit return the covariant type C.
vim9script
class A
endclass
class B extends A
endclass
class C extends B
endclass
class Foo
def Doit(p: B): B
return C.new()
enddef
endclass
class Bar extends Foo
def Doit(p: B): B
return C.new()
enddef
endclass
echo typename(Foo.new().Doit(C.new()))
echo typename(Bar.new().Doit(C.new()))
2. Change the spec and various implementation things.
Doing 1. is backwards compatible with future implementation of the
requested features.
Doing 2. seems rushed.
My first look, not running any code, this change seems to add little, at
the expense of conceptual complexity. I was in the process of manually
working through some things related to this, so I could make a comment,
when it got checked in (seemed pretty quick for a change that wasn't
understood).
Let me know if you see any cases that will break with the latest changs.
What's to rush to add new features that have not been debated?
No rush. I didn't see any objection to the proposal in #12965
And there was no support either; it was not debated. My excuse, not a great one,
is that I was focused on getting 9.1 release to meet spec and uncover any
things that would violate backwards compatibility.
and this is closer to the Dart spec.
So what? The original intent was for simplicity, AFAICT. There was a recent
case, accessing statics, where Dart is simple and was chosen.
In this case, Dart is more complex and doesn't give an advantage, IMHO.
You can already return covariant types with out this change. And adding
contravariant parameter types is confusing and I don't see what it gets you.
I don't see any advantage to making this spec change now, and some disadvantage.
If there's a need, it can be added post 9.1, but not the other way around.
As the changes are minimal to support this, if needed, we can make
adjustments.
—
Reply to this email directly, view it on GitHub.
You are receiving this because you commented.![]()
and I meant vim9script so far I felt it's good for type-checking and performance, but vim9 class to me I felt a bit burdened, not sure if still a chance to make it be simple to use (use for scripting), still wish that's the goal. @errael @yegappan
hi yegappan,
1. first of all, to me the `simple` meant `class` is class like `struct`, I was not like the OOP in vim9script actually, but well that probably would not be accepted by you all now.
2. about the implementation, we've discussed to make class var be default public and only one static keyword. that's another meant `simple`.
3. about the implementation still, now another ticket your proposal class douder methods, that's really something like mixture, if you preferred keyword then how about keyword `new C` for initiation? if you preferred underscore then how about add length()/empty() as another private method? etc.
4. about the `term`, I believe easy way or pre-agreed term before impl and documented it may be better.
Hi,
On Sun, Oct 1, 2023 at 5:17 AM shane qian <shane...@live.com> wrote:
and I meant vim9script so far I felt it's good for type-checking and performance, but vim9 class to me I felt a bit burdened, not sure if still a chance to make it be simple to use (use for scripting), still wish that's the goal. @errael @yegappan
I haven't introduced any fancy OOP features so far. These are the featuresthat Bram has partially implemented or planned for and were already in
the todo list.
The spec clearly says (said)
Object methods of the base class can be overruled. The signature (arguments,
argument types and return type) must be exactly the same. The method of the
base class can be called by prefixing "super.".
I can't find where Bram partially implemented or planned to allow
contravariant parameters. In fact it looks the other way around.
See comments
https://github.com/vim/vim/pull/13221#issuecomment-1741637630 .
After we've all worked hard to resolve incomplete spec issues
(thinking statics) and to get the implementation to meet the spec.
This last minute spec change, which doesn't seem to offer any
useful functionality and hasn't been discussed or tested, feels
ill-conceived.
While this may be something for the future, I see no reason
to change the spec now.
These features are basic to any OOP language.
Can you point to a language that doesn't have overloaded methods
that allows contravariant parameters? I'm not saying there aren't
any (I'm just a country language-lawyer).
[...]
I think using a formal type checking term like "covariance" and "contra-variance"confuses people to think that we are introducing fancy features. But these arejust terms for describing the type check and not new features.
I don't believe that is accurate regarding contra-variant parameters; that is new. And for returning a covariant type that could already be done without removing the requirement that "the signature ... must be exactly the same".
I could haveused "implement appropriate type check for method arguments and returntypes in extended classes".
Regards,
Yegappan
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups "vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/vim_dev/CAAW7x7%3DEMWHk1FmdAfyuZesgyon8BFeB06GUqxsVMULOpasS_A%40mail.gmail.com.
1. we may ask core members to vote, if class is just a struct then no all of those arguments. these were all gone. :smile:
2. it was just saying **default** was to be `public`, didn't mean no `private`.
3. if `new()` is accessed only by `new C`, empty()/length() perhaps can be limited to only internal use too.
I haven't yet looked at the empty()/len() addition; this was in the todo list. I'm guessing this allows the programmer to do
class C...
len(obj_of_type_C)
and get a value defined by the class, could be very handy for a class that is used as a container. Not sure what happens if class didn't define a __len function; guess I'll find out.
What I don't understand is why these spec changes are needed at
the last minute. Seems better to add them after 9.1 is released.
Unless the idea is to wait several months to shake out these new additions. Something being in the todo list does not always imply it gets into a release. Unless it's a simple change, I'd think that stuff would go in at the beginning of the release cycle and not the end.
-ernie
anyway, let's listen someone else if there were, or I am worried what's the end this OOP of vim9 how it would be easy to use.// and sorry I am actually not sure why I was joining to argue this too, aha... maybe there no job to bother me. :lol:
--shane.xb.qian
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups "vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/vim_dev/OS3P286MB0913D94F71C3B843152D4D72EBC6A%40OS3P286MB0913.JPNP286.PROD.OUTLOOK.COM.
On 23/10/01 6:44 AM, Yegappan Lakshmanan wrote:
Hi,
On Sun, Oct 1, 2023 at 5:17 AM shane qian <shane...@live.com> wrote:
and I meant vim9script so far I felt it's good for type-checking and performance, but vim9 class to me I felt a bit burdened, not sure if still a chance to make it be simple to use (use for scripting), still wish that's the goal. @errael @yegappan
I haven't introduced any fancy OOP features so far. These are the featuresthat Bram has partially implemented or planned for and were already in
the todo list.
The spec clearly says (said)
Object methods of the base class can be overruled. The signature (arguments,
argument types and return type) must be exactly the same. The method of the
base class can be called by prefixing "super.".I can't find where Bram partially implemented or planned to allow contravariant parameters. In fact it looks the other way around. See comments
https://github.com/vim/vim/pull/13221#issuecomment-1741637630 .
After we've all worked hard to resolve incomplete spec issues (thinking statics) and to get the implementation to meet the spec. This last minute spec change, which doesn't seem to offer any useful functionality and hasn't been discussed or tested, feels ill-conceived.
While this may be something for the future, I see no reason to change the spec now.
These features are basic to any OOP language.
Can you point to a language that doesn't have overloaded methods that allows contravariant parameters? I'm not saying there aren't any (I'm just a country language-lawyer).
On 23/10/01 8:02 AM, shane qian wrote:
1. we may ask core members to vote, if class is just a struct then no all of those arguments. these were all gone. :smile:
2. it was just saying **default** was to be `public`, didn't mean no `private`.
3. if `new()` is accessed only by `new C`, empty()/length() perhaps can be limited to only internal use too.I haven't yet looked at the empty()/len() addition; this was in the todo list. I'm guessing this allows the programmer to do
class C...
len(obj_of_type_C)and get a value defined by the class, could be very handy for a class that is used as a container. Not sure what happens if class didn't define a __len function; guess I'll find out.
What I don't understand is why these spec changes are needed at the last minute. Seems better to add them after 9.1 is released.
On Sun, Oct 1, 2023 at 11:06 AM Ernie Rael <err...@raelity.com> wrote:
On 23/10/01 6:44 AM, Yegappan Lakshmanan wrote:
Hi,
On Sun, Oct 1, 2023 at 5:17 AM shane qian <shane...@live.com> wrote:
and I meant vim9script so far I felt it's good for type-checking and performance, but vim9 class to me I felt a bit burdened, not sure if still a chance to make it be simple to use (use for scripting), still wish that's the goal. @errael @yegappan
I haven't introduced any fancy OOP features so far. These are the featuresthat Bram has partially implemented or planned for and were already in
the todo list.
The spec clearly says (said)
Object methods of the base class can be overruled. The signature (arguments,
argument types and return type) must be exactly the same. The method of the
base class can be called by prefixing "super.".I can't find where Bram partially implemented or planned to allow contravariant parameters. In fact it looks the other way around. See comments
https://github.com/vim/vim/pull/13221#issuecomment-1741637630 .
After we've all worked hard to resolve incomplete spec issues (thinking statics) and to get the implementation to meet the spec. This last minute spec change, which doesn't seem to offer any useful functionality and hasn't been discussed or tested, feels ill-conceived.
We have two options for the method parameter types.
Actually, we have three options. We could follow the original spec which is invariant parameters: The signature [...] must be exactly the same.
I've been repeating myself. But I still have not seen any answer
as to why the spec, invariant parameters, should be changed rather
than simply enforcing the spec for vim9.1, and revisiting
the issue at some future point. I'd be interested in seeing a real
world example that makes this
change worthwhile.
To be clear, if a method signature says "def Foo(): return A",
that doesn't mean that a subclass of A can't be returned from
Foo().
We can either follow the Typescript/Javaspecification, which supports covariance for the method parameters or follow the Dart specification
which supports contra-variance for the method parameters. As we are already following the Dartspecification for interfaces, I choose the Dart specification.
So what if we chose Dart for one thing. There are some cases where other languages are followed, the idea is to pick something consistent with the vim9script design philosophy. I do not understand why change the spec for a confusing concept. I've only seen contravariant parameters in relationship to generics, for example
In the common case of a generic data structure ilist, covariant parameters are used for methods getting data out of the structure, and contravariant parameters for methods putting data into the structure. the mnemonic for Producer Extends, Consumer Super (PECS), from the book Effective Java by Joshua Bloch gives an easy way to remember when to use covariance and contravariance.
But in our case we are not talking about a generic data structures. And no matter what words you use to describe it, it is not a simple concept. I still review PECS when I design a Java generic class/method. IIRC, generics are on the vim9class todo list; that's probably the proper time to consider contravariant parameters.
-ernie
While this may be something for the future, I see no reason to change the spec now.
These features are basic to any OOP language.
Can you point to a language that doesn't have overloaded methods that allows contravariant parameters? I'm not saying there aren't any (I'm just a country language-lawyer).
Are you referring to covariant parameters here? If you are, then Dart allows only contravariant parametersfor overloaded methods.
Regards,Yegappan
[...]
I think using a formal type checking term like "covariance" and "contra-variance"confuses people to think that we are introducing fancy features. But these arejust terms for describing the type check and not new features.I don't believe that is accurate regarding contra-variant parameters; that is new. And for returning a covariant type that could already be done without removing the requirement that "the signature ... must be exactly the same".
I could haveused "implement appropriate type check for method arguments and returntypes in extended classes".
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups "vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/vim_dev/CAAW7x7mPtLqJsD0w8a%3DODLj5V%3Dj4-OZ__TPbkC90AXz%3D5byNrw%40mail.gmail.com.
On 23/10/01 2:56 PM, Yegappan Lakshmanan wrote:
On Sun, Oct 1, 2023 at 11:06 AM Ernie Rael <err...@raelity.com> wrote:
On 23/10/01 6:44 AM, Yegappan Lakshmanan wrote:
Hi,
On Sun, Oct 1, 2023 at 5:17 AM shane qian <shane...@live.com> wrote:
and I meant vim9script so far I felt it's good for type-checking and performance, but vim9 class to me I felt a bit burdened, not sure if still a chance to make it be simple to use (use for scripting), still wish that's the goal. @errael @yegappan
I haven't introduced any fancy OOP features so far. These are the featuresthat Bram has partially implemented or planned for and were already in
the todo list.
The spec clearly says (said)
Object methods of the base class can be overruled. The signature (arguments,
argument types and return type) must be exactly the same. The method of the
base class can be called by prefixing "super.".I can't find where Bram partially implemented or planned to allow contravariant parameters. In fact it looks the other way around. See comments
https://github.com/vim/vim/pull/13221#issuecomment-1741637630 .
After we've all worked hard to resolve incomplete spec issues (thinking statics) and to get the implementation to meet the spec. This last minute spec change, which doesn't seem to offer any useful functionality and hasn't been discussed or tested, feels ill-conceived.
We have two options for the method parameter types.
Actually, we have three options. We could follow the original spec which is invariant parameters: The signature [...] must be exactly the same.
I've been repeating myself. But I still have not seen any answer as to why the spec, invariant parameters, should be changed rather than simply enforcing the spec for vim9.1, and revisiting
the issue at some future point. I'd be interested in seeing a real world example that makes this
change worthwhile.
Is that really three variations of variance in about as many days? I can't keep up.
This is a foundational principle of OOP. If we can't start from a common understanding of reality these threads aren't very useful.
Referencing other languages is becoming counter-productive. I've also done this in past discussions because Bram had done so in the documentation and as a short-hand but it's becoming distracting. Dart, in isolation, is not relevant here; it's not a pioneer of contravariance.
However, for general reference, TypeScript supports bivariance with a compiler flag for strict contravariance and Dart supports contravariance with a keyword for covariance. The following languages, OTTOMH, all support contravariance - Python, PHP, Kotlin, Scala, Swift, Flow and others. Java doesn't support it, presumably because it doesn't play nicely with their overloading implementation.
I'm not sure what parallel there is with the static members implementation and discussion. The initial implementation was "weird" and it was made sane. The functionality wasn't hobbled in some nebulous pursuit of simplicity. This latest change makes the type system less expressive. Given the state of play has existed for forty years I'm not sure what is going to be illuminated by deferring a decision.
Anyway, my initial report was primarily interested in having the unsound covariance resolved which it has been, thanks.
—
Reply to this email directly, view it on GitHub.
You are receiving this because you commented.![]()
Is that really three variations of variance in about as many days? I can't keep up.
This is a foundational principle of OOP. If we can't start from a common understanding of reality these threads aren't very useful.
Yes and Yes. Hopefully we're just talking about implementation issues.
Referencing other languages is becoming counter-productive. I've also done this in past discussions because Bram had done so in the documentation and as a short-hand but it's becoming distracting. Dart, in isolation, is not relevant here; it's not a pioneer of contravariance.
However, for general reference, TypeScript supports bivariance with a compiler flag for strict contravariance and Dart supports contravariance with a keyword for covariance. The following languages, OTTOMH, all support contravariance - Python, PHP, Kotlin, Scala, Swift, Flow and others. Java doesn't support it, presumably because it doesn't play nicely with their overloading implementation.
I'm not sure what parallel there is with the static members implementation and discussion. The initial implementation was "weird" and it was made sane.
Exactly, the spec was never finished regarding statics, and a sane implementation was required. The point of mentioning that, is that the spec was unfinished and most agreed the implementation was broken.
This discussion, Xvariant behavior, is very different; it's about a spec change. I don't think Bram accidentally wrote, back in February
The signature (arguments, argument types and return type) must be exactly the same.
That sentence now appears twice in the spec. Implementing that in no way constrains future development, AFAICT. In fact, I think it provides maximum flexibility going forward. Less is more.
The functionality wasn't hobbled in some nebulous pursuit of simplicity.
I'm not sure to what this is referring. In general I agree with the implied goal.
This latest change makes the type system less expressive.
True. But, from what I've read, the type system isn't finished. I hope the type system is extended in a well thought out and coordinated fashion, rather than piecemeal (like Java?).
Given the state of play has existed for forty years I'm not sure what is going to be illuminated by deferring a decision.
Syntax. You've pointed out that there are several ways the concept can be expressed in a language. And, at least in Java, it's not supported in method signatures at all; but the concept is intimate with Java generics (PECS). The type system needs time and effort, and I would think Xvariance needs to be part of that.
Anyway, my initial report was primarily interested in having the unsound covariance resolved which it has been, thanks.
Agree. When I saw the initial report, I figured another spec violation to fix (and with suggestions for the future); not a new feature at this late date. Personally, I think every spec change requires discussion and burn in time; there are sometimes unintended consequences or implications.
Every time the spec is changed, the release date must be pushed out to insure reliability.
I'd like to see vim9.1 release soon, maybe that's a point of disagreement.
—
Reply to this email directly, view it on GitHub.
You are receiving this because you commented.![]()
Sorry, I don't think I was notified of this reply but noticed it when checking the history of this general issue. A day late and a dollar short...my usual style.
This discussion, Xvariant behavior, is very different; it's about a spec change. I don't think Bram accidentally wrote, back in February
The signature (arguments, argument types and return type) must be exactly the same.That sentence now appears twice in the spec. Implementing that in no way constrains future development, AFAICT. In fact, I think it provides maximum flexibility going forward. Less is more.
In my opinion it's a pre-alpha design/help document covering a first pass partial implementation. We can't divine how this would otherwise have turned out and I think we should just attempt to develop the best language possible. Bram was actually pretty flexible and, for example, reworked closures after the 9.0 release.
The first line of the "spec" states: "NOTE - This is not finished yet, anything can still change! - NOTE"
It's leveraged and ignored at will, and as has come to pass again, it's been changed with the resolution to this issue.
Given the state of play has existed for forty years I'm not sure what is going to be illuminated by deferring a decision.
Syntax. You've pointed out that there are several ways the concept can be expressed in a language. And, at least in Java, it's not supported in method signatures at all; but the concept is intimate with Java generics (PECS). The type system needs time and effort, and I would think Xvariance needs to be part of that.
I wasn't proposing any syntax changes. This is a simple type-checking.
—
Reply to this email directly, view it on GitHub.
You are receiving this because you commented.![]()
In my opinion [the spec is] a pre-alpha
I'm not sure I'd go that far, I could see alpha, if you think of the eventual vim9.1 release as a beta, then anything implemented in the release should be beta. Haven't heard much about release targets lately (maybe some implicit hints). But I've also hear that vim9.1 class code is supposed to be compatible with the releases after that; I don't see how that's reconciled with an alpha or beta spec (for what's implemented).
we should just attempt to develop the best language possible
I agree. I guess the basic question/issue is whether or not we can release something that is compatible with future releases.
Given the state of play has existed for forty years I'm not sure what is going to be illuminated by deferring a decision.
Syntax. You've pointed out that there are several ways the concept can be expressed in a language. And, at least in Java, it's not supported in method signatures at all; but the concept is intimate with Java generics (PECS). The type system needs time and effort, and I would think Xvariance needs to be part of that.
I wasn't proposing any syntax changes. This is a simple type-checking.
What I meant by that, assuming there's evolution in the type system, is that for specifying contra-variant parameters it may be desirable to have some syntax. I think some language uses in:/out: for example (reminds me of Java's extends/super).
Saying that parameters can be contra-variant feels like a big change that could cause problems. And it would be good to know how the type system works with future stuff, there's generics in the todo list. Unless someone can say with confidence that "there's no problems and it all work" with suggestions on how it fits in with future development... If a vim9.1 release can be delayed, I'm not sure for how long, then these questions could probably be resolved before it's released.
I'm not saying contra-variant parameters shouldn't be handled. I'm asking if they need to be handled right now? What's the downside if they are not?
—
Reply to this email directly, view it on GitHub.
You are receiving this because you commented.![]()