Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update coherence and orphan rules documentation to match RFC 2451 #703

Merged
merged 5 commits into from
Nov 7, 2019
Merged

Update coherence and orphan rules documentation to match RFC 2451 #703

merged 5 commits into from
Nov 7, 2019

Conversation

ohadravid
Copy link
Contributor

As part of stabilizing RFC 2451 (re-rebalance coherence) in rust-lang/rust#65879, I wanted to update the reference to match it.

I copied the relevant parts of the RFC, with a slight rewording by @nikomatsakis (comment).

src/items/coherence.md Outdated Show resolved Hide resolved
In languages without coherence, the compiler has to have some way to choose
which implementation to use when multiple implementations could apply. Scala
does this by having complex scope resolution rules for "implicit" parameters.
Haskell (when a discouraged flag is enabled) does this by picking an impl
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This entire paragraph is irrelevant. Haskell (mainly) and other languages are only interesting for the purposes of "influences".

src/items/coherence.md Outdated Show resolved Hide resolved
src/items/coherence.md Outdated Show resolved Hide resolved
src/items/coherence.md Outdated Show resolved Hide resolved
src/items/coherence.md Outdated Show resolved Hide resolved
@@ -0,0 +1,79 @@
## What is coherence and why do we care?
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this text should mainly explain that overlap is prevented (and the rules for that) and that orphans are not allowed (and the rules for that).

Question to @nikomatsakis: is the orphan rule actually part of preventing overlap in the compiler?

@Centril Centril self-assigned this Oct 27, 2019
@ohadravid
Copy link
Contributor Author

ohadravid commented Oct 28, 2019

Hi @Centril!

I made the changes you requested, and since all the terms seemed relevant I moved all of them to the glossary, making the coherence explanation much shorter so I moved it back to where it was. If you think this is too much for the glossary I can also move them back/move only some of them/etc.

Your question to Niko about the orphan rule/overlap is still relevant, because the old text is not too specific there either (I changed it back to the way it was).

One question about defining fundamental types: I looked for the attribute, and saw that Pin was added since the RFC (So I added it to the list).
Generator is also there, but I didn't add it because it is unstable.
So should there be a sentence like "the lang may define additional types which are considered fundamental"?

@nikomatsakis
Copy link
Contributor

@ohadravid thanks for doing this!

src/glossary.md Outdated Show resolved Hide resolved
src/glossary.md Outdated Show resolved Hide resolved
src/glossary.md Outdated
@@ -65,6 +73,13 @@ For example, `2 + (3 * 4)` is an expression that returns the value 14.
An [item] that is not a member of an [implementation], such as a *free
function* or a *free const*. Contrast to an [associated item].

### Fundamental Type

Includes `&`, `&mut`, `Box` and `Pin`. Any time a type `T` is
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some points & questions (which @nikomatsakis may help with):

  • & and friends are not types; they are type constructors.

  • Suppose we have #[fundamental] struct W<P0, P1> { ... }. How would W<A0, A1> behave with respect to locality? In this case the addition of a second type parameter is intentional so that we can suss out the essence of how fundamental types behave. It seems lifetimes have no effect on locality.

  • Before itemizing the list of fundamental types it would be good to give a definition of how such types behave.

  • What about fundamental traits?

src/glossary.md Outdated Show resolved Hide resolved
src/glossary.md Outdated Show resolved Hide resolved
src/glossary.md Outdated Show resolved Hide resolved
src/glossary.md Outdated Show resolved Hide resolved
src/items/implementations.md Outdated Show resolved Hide resolved
src/items/implementations.md Outdated Show resolved Hide resolved
src/items/implementations.md Outdated Show resolved Hide resolved
@Centril
Copy link
Contributor

Centril commented Oct 28, 2019

If you think this is too much for the glossary I can also move them back/move only some of them/etc.

No it's good. :)

So should there be a sentence like "the lang may define additional types which are considered fundamental"?

I think we sorta want to give a description of behavior for any arbitrary fundamental type that is semi-syntactic in that it talks about type arguments and type constructors and how those relate wrt. locality and such. Then we can itemize a list of fundamental type constructors.

@ohadravid
Copy link
Contributor Author

I applied all your edits @Centril , also edited some more title case -> sentence case and such.

I changed the fundamental types part to use the type constructor wording, but I leave it to Niko to define what they are :)

I did use the order of: what are fundamentals, itemized list, locality.
Explaining it with locality first didn't sound right (you have to use at least &T and Box<T> when explaining locality, because of the different syntax, and than it seems like &mut T and Pin are somehow different..) but that's all more like a placeholder until we have the actual description.

@ohadravid
Copy link
Contributor Author

@Centril @nikomatsakis I used Niko's definitions from RFC 1023.
They seem to fit the reference, but I wasn't too sure if more explanation is needed. I also added the definition of fundamental traits for completeness.

@Centril
Copy link
Contributor

Centril commented Nov 7, 2019

Filed #714 for any follow-ups to the more formal spec.

@Centril
Copy link
Contributor

Centril commented Nov 7, 2019

Thanks!

@Centril Centril merged commit 1ad8c2e into rust-lang:master Nov 7, 2019
@ohadravid ohadravid deleted the rfc-2451-coherence branch November 7, 2019 10:02
bors added a commit to rust-lang/rust that referenced this pull request Nov 9, 2019
…nikomatsakis

Stabilize the `re_rebalance_coherence` feature

This PR stabilizes [RFC 2451](https://rust-lang.github.io/rfcs/2451-re-rebalancing-coherence.html), re-rebalance coherence.

Changes include removing the attribute from tests which tested both the old and new behavior, moving the feature to `accepted` and removing the old logic.

I'll also open a [PR](rust-lang/reference#703) against the reference, updating it with the content of the RFC.

Closes #63599

r? @nikomatsakis
bors added a commit to rust-lang/rust that referenced this pull request Nov 17, 2019
Update Cargo, books

## cargo

12 commits in 5da4b4d47963868d9878480197581ccbbdaece74..8280633db680dec5bfe1de25156d1a1d53e6d190
2019-10-28 21:53:41 +0000 to 2019-11-11 23:17:05 +0000
- Don't panic when parsing `/proc/stat` (rust-lang/cargo#7580)
- Fix unused configuration key warning for a few keys under `build`. (rust-lang/cargo#7575)
- Add back support for `BROWSER` envvar in `cargo doc --open`. (rust-lang/cargo#7576)
- Only include "already existing ..." comment in gitignore on conflict (rust-lang/cargo#7570)
- Add VS Code user dir to .gitignore (rust-lang/cargo#7578)
- Added aliases to subcommand typo suggestions. (rust-lang/cargo#7486)
- Use multiple requirement syntax consistently (rust-lang/cargo#7573)
- Update verison to 0.42 (rust-lang/cargo#7568)
- Expand documentation on build scripts. (rust-lang/cargo#7565)
- Update crossbeam-utils requirement from 0.6 to 0.7 (rust-lang/cargo#7566)
- don't download std-docs on CI (rust-lang/cargo#7513)
- Change my-buddy to github-handle (rust-lang/cargo#7553)

## nomicon

2 commits in 5004ad30d69f93553ceef74439fea2159d1f769e..58e36e0e08dec5a379ac568827c058e25990d6cd
2019-10-12 19:52:40 +0200 to 2019-10-30 08:14:24 -0500
- remove references to the nursery
- Add github action to replace Travis.yml (rust-lang/nomicon#172)

## reference

7 commits in 4b21b64..45558c4
2019-10-27 22:33:11 +0100 to 2019-11-08 14:47:35 +0100
- Audit code blocks. (rust-lang/reference#715)
- Update coherence and orphan rules documentation to match RFC 2451 (rust-lang/reference#703)
- Update organization name (rust-lang/reference#713)
- State that no_implicit_prelude also applies to nested modules (rust-lang/reference#707)
- expand Copy docs (rust-lang/reference#711)
- github action doesn't use the nursery (rust-lang/reference#706)
- Migrate to GitHub Actions. (rust-lang/reference#705)

## book

1 commits in 28fa3d15b0bc67ea5e79eeff2198e4277fc61baf..e79dd62aa63396714278d484d91d48826737f47f
2019-10-29 07:16:09 -0500 to 2019-10-30 07:33:12 -0500
- No need for an iterator here to fetch values (rust-lang/book#1957)

## rust-by-example

1 commits in f3197ddf2abab9abdbc029def8164f4a748b0d91..dcee312c66267eb5a2f6f1561354003950e29105
2019-10-29 10:17:40 -0300 to 2019-10-31 11:26:53 -0300
- refactor: simplify extracting Result from Option (rust-lang/rust-by-example#1283)

## edition-guide

2 commits in e58bc4ca104e890ac56af846877c874c432a64b5..f553fb26c60c4623ea88a1cfe731eafe0643ce34
2019-07-31 20:14:12 +0200 to 2019-10-30 08:27:42 -0500
- remove old references to the nursery
- Port from Travis to GitHub Actions (rust-lang/edition-guide#192)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants