Principle: One static open extension mechanism

Pull request

Table of contents

Problem

There are a few ways of approaching open extension, such as defining how operators are overload for every type. For Carbon, with its focus on performance, we are particularly interested in those that support static dispatch, to avoid the runtime overhead of dynamic dispatch. The three main options are:

  • Open function overloading, where new overloads for a given name can be defined broadly, as is done in C++.
  • Interfaces, as is done in Rust.
  • Special method names, as are used in C++ and Python.

We would prefer to use a single mechanism, if possible, for simplicity.

Proposal

Proposal is to use interfaces as the single open extension mechanism.

Details

Details are in the added principle doc: docs/project/principles/static_open_extension.md.

Rationale based on Carbon’s goals

This proposal is pursuing Carbon’s goal of having code that is easy to read, understand, and write.

Alternatives considered

Early arguments for this approach were put forth in this document.