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

Checked and template generic terminology #2138

Merged
merged 9 commits into from
Sep 10, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
135 changes: 135 additions & 0 deletions proposals/p2138.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
# Checked and template generic terminology

<!--
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/2138)

<!-- toc -->

## Table of contents

- [Abstract](#abstract)
- [Problem](#problem)
- [Proposal](#proposal)
- [Rationale](#rationale)
- [Alternatives considered](#alternatives-considered)
- [Status quo: "generic" means "checked"](#status-quo-generic-means-checked)
- [Use the name "templates" instead of "template generics"](#use-the-name-templates-instead-of-template-generics)
- [Use the name "unchecked generics" instead of "template generics"](#use-the-name-unchecked-generics-instead-of-template-generics)

<!-- tocstop -->

## Abstract

Change terminology from "generics" and "templates" to "checked generics" and
"template generics". Afterwards, "generics" will be an umbrella term that
include templates.

## Problem

The C++ community does "generic programming" using templates in C++, and so
thinks of templates as a mechanism for implementing generics. In Carbon,
templates and other generic features are more similar than they are different,
so it is worthwhile to have an easy way to talk about things that apply to both.

## Proposal

Change terminology from "generics" and "templates" to "checked generics" and
"template generics". Afterwards, "generics" will be an umbrella term that
include templates.
josh11b marked this conversation as resolved.
Show resolved Hide resolved

Similarly, for parameters, use "checked generic parameter" and "template generic
parameter", with the umbrella term "generic parameter" describing both kinds.
The word "generic" can be omitted from these terms if it's clear from context,
which will usually be the case for template parameters.

Some existing design docs give examples of the difference before and after this
proposal:

- The [generics overview](/docs/design/generics/overview.md), for example,
currently demonstrates the current approach of using "generics" and
"templates".
- The
[generics section of the design overview](/docs/design/README.md#generics)
demonstrates the use of the proposed new terminology.

## Rationale

Using the terminology expected by the community supports these goals:
jonmeow marked this conversation as resolved.
Show resolved Hide resolved

- [Code that is easy to read, understand, and write](/docs/project/goals.md#code-that-is-easy-to-read-understand-and-write)
since our documentation governing the interpretation of that code will be
more easily understood and with greater accuracy.
- [Interoperability with and migration from existing C++ code](/docs/project/goals.md#interoperability-with-and-migration-from-existing-c-code)
since there will be a smaller terminology gap between Carbon and C++.
Copy link
Contributor

Choose a reason for hiding this comment

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

Isn't this just shifting the terminology gap, because "templates" are now "template generics"? How does this reduce the terminology gap?

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 the specific improvement is that in C++, people talk about doing generic programming with templates, and with this shift in terminology you can talk about doing generic programming with template [generic]s in Carbon too.

josh11b marked this conversation as resolved.
Show resolved Hide resolved

## Alternatives considered

### Status quo: "generic" means "checked"

Use "generic" for checked generics, "template" for template generics, and
"template or generic" when we mean both.

Advantages:

- The terms "generic" and "template" are more concise than "checked generic"
and "template generic".
- The term "template" is more familiar than "template generic" to people
coming from C++.

Disadvantages:

- Does not provide a unifying term for templates and generics, leading to our
needing to talk about both in various places, given that they are very
similar concepts in Carbon.
- Does not acknowledge that templates are used for generic programming and as
such are a kind of generic.
- Carbon's template generics aren't exactly the same as C++'s templates, so
this may give the wrong intuition for people coming from C++ in some cases.

### Use the name "templates" instead of "template generics"

Use "checked generic" for checked generics, "template" for template generics,
and "generic" when we mean both.

Advantages:

- More concise term than in this proposal.
- More familiar to people coming from C++.
- People will likely use this term anyway rather than saying "template
generics".

Disadvantages:

- Does not parallel the term "checked generics".
- Loses the implication that a template generic is a kind of generic.
- Carbon's template generics aren't exactly the same as C++'s templates, so
this may give the wrong intuition for people coming from C++ in some cases.

### Use the name "unchecked generics" instead of "template generics"

Use "checked generic" for checked generics, "unchecked generic" for template
generics, and "generic" when we mean both.

Advantages:

- Creates a better parallel between "checked generics" and "unchecked
generics".
- Describes the semantics rather than the implementation strategy, especially
given that templating / monomorphization is also the implementation strategy
we intend to use for unchecked generics.

Disadvantages:

- Unfamiliar to people coming from C++.
- Would either need to rename the `template` keyword or pick new non-keyword
syntax for it, or have a mismatch between keywords and terminology.
- Template generics still involve checking, it just can't complete until later
when the argument values are known.

This was suggested in
[#1443](https://github.com/carbon-language/carbon-lang/pull/1443).