Open11
Carbon langに関するメモ
Carbon👀
ビルドメモ
基本はREADME通りでいいですが、WSLで試したらzlibがないと怒られました。この件は既にPRが作られています。
sudo apt install zlib1g-dev
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]
こんな感じに制約のアンドをとる場合、!
は否定として使う可能性があるのでは?という懸念が。いまのところ!
はコンパイル時定数を表すらしい?
プリミティブ型メモ
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
""";
Operatorメモ
- Move:
~x
std::move(x)
に比べると短くていいですね。
パターンメモ
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
が入るみたいです。
Name-binding declarationsメモ
-
let
: 定数 -
var
: 変数
全ての変数宣言は定義になるらしいです。
User-defined typesメモ
Choice types
choice IntResult {
Success(value: i32),
Failure(error: String),
Cancelled
}
おお、いいですね。もちろんmatch
と一緒に使えます。
ゴールではないことメモ
- 安定した言語とABI / 後方・前方互換性
- 進化しつづける言語にしたいみたいですね
その他の議論メモ
i64 vs int64
いまのところRustのようにi64
という命名にしてますが、int64
の方が人気ありますね。分かりやすいとは思うんですが、int
uint
float
で全部文字数違うの気になるんですよね...。
Cargoのようなビルドシステム
欲しいですよね。ロードマップでは一応エコシステムについて言及されてますが、まだ流石に早すぎる議論っぽいです。
if文 / if式
if文は普通に if
else
です。
if(a == 0) { ... }
else { ... }
対してif式は if
then
else
となっています。三項演算子は廃止ですかね。
var result: auto = if a == 0 then ... else ...;