-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
6 changed files
with
69 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
# Remove `Void` | ||
|
||
<!-- | ||
Part of the Carbon Language project, under the Apache License v2.0 with LLVM | ||
Exceptions. See /LICENSE for license information. | ||
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
--> | ||
|
||
[Pull request](https://github.com/carbon-language/carbon-lang/pull/540) | ||
|
||
<!-- toc --> | ||
|
||
## Table of contents | ||
|
||
- [Problem](#problem) | ||
- [Background](#background) | ||
- [Proposal](#proposal) | ||
- [Rationale based on Carbon's goals](#rationale-based-on-carbons-goals) | ||
- [Alternatives considered](#alternatives-considered) | ||
|
||
<!-- tocstop --> | ||
|
||
## Problem | ||
|
||
The `Void` type as | ||
[currently specified](https://github.com/carbon-language/carbon-lang/blob/4bf396b8f6e7f5289c170c5ad9dda64c5c680d4a/docs/design/README.md#primitive-types) | ||
is redundant with `()`, the type of a tuple with no elements. | ||
|
||
## Background | ||
|
||
[Issue 443](https://github.com/carbon-language/carbon-lang/issues/443) contains | ||
further discussion of the problem, and possible solutions. The consensus of the | ||
Carbon leads was that `Void` should be removed. | ||
|
||
## Proposal | ||
|
||
Remove `Void` from the Carbon design. | ||
|
||
## Rationale based on Carbon's goals | ||
|
||
Eliminating `Void` will make Carbon code | ||
[easier to read, understand, and write](https://carbon-lang.dev/docs/project/goals.html#code-that-is-easy-to-read-understand-and-write). | ||
The main advantage of `Void` is that it is recognizable and familiar to C++ | ||
programmers. However, we haven't yet found any use cases where using `Void` | ||
results in clearer code, even to programmers transitioning from C++. In | ||
particular, omitting a function's return type is more concise and at least as | ||
clear as explicitly specifying `-> Void`. In most other use cases, the | ||
appearance of familiarity is more likely to mislead than to clarify: most other | ||
use cases for C++ `void`, such as using `void*` to mean "pointer to anything", | ||
will not work with Carbon's `Void`, and most other use cases for Carbon's | ||
`Void`, such as using it as the type of a variable, would not work with C++'s | ||
`void`, | ||
|
||
## Alternatives considered | ||
|
||
- Define `Void` as an alias for `()`. This is workable, but forces users to | ||
understand both spellings, and make a style choice between them. | ||
- Define `Void` as a distinct type from `()` with the same semantics. This | ||
forces users to know "which kind of nothing" to use in any given context | ||
- Define `Void` as a distinct type from `()`, with more C++-like semantics. | ||
This would reproduce the problems of C++'s `void`, for no clear benefit. | ||
- Eliminate `()`. This would needlessly complicate programming with tuples, | ||
especially in variadic settings. | ||
|
||
See [issue 443](https://github.com/carbon-language/carbon-lang/issues/443) for | ||
details. |