rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
98.33k stars 12.72k forks source link

Tracking issue for RFC 2700: numeric constants as associated consts #68490

Open LukasKalbertodt opened 4 years ago

LukasKalbertodt commented 4 years ago

This is a tracking issue for the RFC 2700 (rust-lang/rfcs#2700): "Deprecate stdlib modules dedicated to numeric constants and move those constants to associated consts".

Steps:

Unresolved questions:

agausmann commented 4 years ago

Add new constants (see #68123)

68325 is the relevant PR.

faern commented 4 years ago

I have implemented the stabilization and documentation changes needed to show people which constant is the preferred one now. I will submit this as a PR in a few days when the unstable version has been out for a bit over a week.

You can find the code here: https://github.com/rust-lang/rust/compare/master...faern:stabilize-assoc-int-consts?expand=1

What parts of it I don't think will be controversial at all:

Other changes that possibly might create some discussion:

I opted for doing what Error::description() did with the documentation. Saying something like this:

//! **this module is soft-deprecated.**
//!
//! Although using these constants won’t cause compilation warnings,
//! new code should use the associated constants directly on
//! the [`i128` primitive type](../../std/primitive.i128.html) instead. 

I added soft deprecation notices to:

faern commented 4 years ago

The code/docs were changed a bit after I wrote that last comment just above. But the stabilization PR is live now.

faern commented 4 years ago

One thing that remains is to improve the compiler error that mentions the MIN and MAX constants. Try this code on nightly:

fn main() {
    match 5i32 {
        5 => (),
    }
}

It gives the following error:

error[E0004]: non-exhaustive patterns: `std::i32::MIN..=4i32` and `6i32..=std::i32::MAX` not covered

Now when the associated constants are the preferred ones the error should be

error[E0004]: non-exhaustive patterns: `i32::MIN..=4i32` and `6i32..=i32::MAX` not covered
bstrie commented 4 years ago

As the original author of RFC 2700, I propose the following resolution to the two currently-listed unresolved questions:

  1. "Should the old items be deprecated?" I propose yes. I have a PR here for further discussion: https://github.com/rust-lang/rust/pull/78335

  2. "Should constants from std::{f32, f64}::consts also be made associated consts?" I propose no. As mentioned in the RFC, the majority of the benefit of this change concerns the integer types, which have no analogue to the consts module on the float types. While it remains my opinion that having a stdlib type shadowing a primitive type is undesirable, I think it's reasonable to leave this topic to a future RFC.

Lokathor commented 4 years ago

if I can't just write f32::NAN then what the heck is the point of any of this.

bstrie commented 4 years ago

Unsure if that was meant to be sarcasm, but if you take the time to read the original RFC you will see that the point of all this is that std::u8::MAX and u8::max_value() are both substandard alternatives to u8::MAX that only exist because of extremely temporary historical technical limitations. When fixing this for the integral types it was natural to preserve symmetry with the floating point types as well. Some people objected to all the constants defined for the floating point types being given this treatment. Since the point of the RFC was to fix the integral types, we conceded so as to avoid gridlock over tangential concerns. The libs team could, of course, decide to change this policy (it would not be out of the realm of possibility to simply amend the existing RFC), but I am not on the libs team. My PR fully deprecates the constants that were superseded in https://github.com/rust-lang/rust/pull/68952 . I'm content to take this one step at a time.

Lokathor commented 4 years ago

I was not being sarcastic at all.

If floating types don't get the same design fixes applied them, then that's dumb for all the reasons that std::u8::MAX is dumb.

bstrie commented 4 years ago

You're preaching to the choir; as mentioned in the accepted RFC, the original RFC text had proposed this treatment for all the float constants. I'd be happy if the libs team decided to deprecate the float shadow modules as well, but in the absence of that decision there's no need to put off deprecating the integral shadow modules any longer. This RFC has gone on for quite long already.

bstrie commented 4 years ago

(It's also worth noting that your specific example of f32::NAN does indeed already exist as a result of this RFC, and the alternative std::f32::NAN would be deprecated by my PR. It's things like std::f32::consts::PI that wouldn't be.)

bstrie commented 4 years ago

In my deprecation PR I ran into some obstacles and have updated the issue here with references to new issues and PRs. I'll hold off on proposing deprecation until those are addressed.

m-ou-se commented 3 years ago

We discussed the open questions in the library meeting last week. Our conclusions were:

Should the old items be deprecated?

Yes.

Should constants from std::{f32, f64}::consts also be made associated consts?

No. At least not as part of this tracking issue/RFC. That could be a separate proposal, with a separate discussion.

bstrie commented 3 years ago

Checking off "adjust the documentation" (found no uses of the old consts in the reference, the book, or Rust By Example, which I presume faern fixed when originally adjusting the stdlib docs). In addition #79877 has landed, which finishes checking off all the new issues that were filed after the closing of the prior deprecation effort (#78335). Once #79877 rides the train into beta later this month I'll file a new deprecation PR. And once that's all done I'll write up a new RFC to discuss the fate of the floating-point const modules.

bstrie commented 3 years ago

With the merge of https://github.com/rust-lang/rust/pull/80958 , I'm happy with where this is at. I will leave this issue open until such time as the old items are marked as fully deprecated rather than just deprecated-in-future, but making that change is not a priority of mine at this moment.

pitaj commented 1 year ago

RE from #107587

The float modules are a bit weird since all the constants mentioned above are redundant, but they also contain the core::{f32, f64}::consts modules, and these do contain information that isn't available elsewhere (constants like E, PI, SQRT_2, etc)

Can we move them into a module like core::math or something?

Then we could fully deprecate core::f32 and core::f64

pitaj commented 1 year ago

Putting it here because I haven't see much discussion elsewhere. small previous discussion

It appears that the std::char constants haven't been marked as "deprecated" or "deprecation planned", despite all being on the char primitive type as well. It seems weird to keep duplicate constants around. Is this something needing a separate RFC (or maybe just ACP) or can we loop it in here?

faern commented 1 year ago

Can we move them into a module like core::math or something?

* `core::f32::consts` would become `core::math::f32`
* `core::f64::consts` would become `core::math::f64`

I don't think creating yet another copy of the constants is the right direction. Since the old ones can't be removed, only deprecated, the API surface will inevitably grow. I'm all for moving constants to better places when the new place is actually better. Here it feels like they are equally bad/good but just duplicated for the sake of deprecation.

Personally I always wanted to move the float constants onto the actual float types as well. But I know this was controversial back in RFC 2700. I know there was some talk about being able to put modules in types, so one could have f32::math::PI but that the language did not at the time support it. I can't find that comment now so I'm not sure what the status of this is.

It appears that the std::char constants haven't been marked as "deprecated" or "deprecation planned", despite all being on the char primitive type as well. It seems weird to keep duplicate constants around. Is this something needing a separate RFC (or maybe just ACP) or can we loop it in here?

I'm all for deprecating that as well, but not in this RFC/issue. This issue seems to be controversial as is and moves way too slowly. Anything that can just have this be merged asap would be great. Then further similar work can happen in other RFCs. If we let RFCs scope creep it will greatly slow down their progress.

pitaj commented 1 year ago

You can kind of emulate a module in this case by using inherent_associated_types: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=1498d15e059ff14dd69ae46c5a10ee94