Open11

Carbon langに関するメモ

NishikiNishiki

Genericsメモ

C++のこれが

template <typename T>
void SortVector(std::vector<T>* a) {...}

こうなります。

fn SortVector(T:! Comparable, a: Vector(T)*) { ... }

実際はモダンな感じに Comparable のような制約がつけられるのでC++でいう concept の方が近いですね。(C++に詳しくないのでよく分かってない)
Carbonではインスタンスを作らなくても型チェックが入るらしいのでダックタイピング的ではなくなるとのこと。

記号は!でいい?

[T:! Comparable & Movable]

こんな感じに制約のアンドをとる場合、!は否定として使う可能性があるのでは?という懸念が。いまのところ!はコンパイル時定数を表すらしい?
https://github.com/carbon-language/carbon-lang/issues/565
https://github.com/carbon-language/carbon-lang/discussions/1425

NishikiNishiki

プリミティブ型メモ

  • bool
  • i8 i16 i32 i64 i128 i256 Carbon.Int(N)
  • u8 u16 u32 u64 u128 u256 Carbon.UInt(N)
  • f16 f32 f64
  • String StringView

StringViewがあるのいいですね。複数行文字列リテラルもサポートしてます。

var str: String = """
    Hello, World
    Multi-line string literals, called block string literals
    """;
NishikiNishiki

パターンメモ

Destructuring patterns

fn Bar() -> (i32, String);

var (p: i64, _: auto) = Bar();

C++17で構造化束縛は使えますが、正直std::tuple<int32_t, std::string>とか書かなくていいだけでも嬉しいです。

Refutable patterns

match (n) {
    case a => { }
    case b => { }
    default => { }
}

matchが入るみたいです。

NishikiNishiki

Name-binding declarationsメモ

  • let: 定数
  • var: 変数

全ての変数宣言は定義になるらしいです。

NishikiNishiki

User-defined typesメモ

Choice types

choice IntResult {
  Success(value: i32),
  Failure(error: String),
  Cancelled
}

おお、いいですね。もちろんmatchと一緒に使えます。

NishikiNishiki

ゴールではないことメモ

  • 安定した言語とABI / 後方・前方互換性
    • 進化しつづける言語にしたいみたいですね
NishikiNishiki

その他の議論メモ

i64 vs int64

いまのところRustのようにi64という命名にしてますが、int64の方が人気ありますね。分かりやすいとは思うんですが、int uint floatで全部文字数違うの気になるんですよね...。
https://github.com/carbon-language/carbon-lang/discussions/1696

Cargoのようなビルドシステム

欲しいですよね。ロードマップでは一応エコシステムについて言及されてますが、まだ流石に早すぎる議論っぽいです。
https://github.com/carbon-language/carbon-lang/issues/1544
https://github.com/carbon-language/carbon-lang/issues/1573

NishikiNishiki

if文 / if式

if文は普通に if elseです。

if(a == 0) { ... }
else { ... }

対してif式は if then elseとなっています。三項演算子は廃止ですかね。

var result: auto = if a == 0 then ... else ...;