Ches 言語仕様
記述項目
言語設計
設計方針
パラダイム
ブロック構造
スコープ
式
括弧括り
リテラル
演算子
各演算子
キーワード
識別子
命名規則
予約語 (キーワード)
モジュール
変数
所有権
借用
参照
可変性
ライフタイム
参照 → 独立ページ
生ポインタ
スマートポインタ
定数
ローカル / グローバル変数
データ型
基本型
型強制
型エイリアス
可変性, 参照
数値
整数
浮動小数点数
文字
文字列
修飾子
アクセス修飾子
スコープ
関数
デフォルト引数
返り値
クロージャ (ラムダ式)
多重定義なし
メソッド (意訳すると?自己関数) と可変性
条件分岐
if
match? 名詞避けたい
反復処理
loop
for
while
イテレータ
スライス
構造体
タプル構造体
フィールド
定数フィールド
readonly
実体化
列挙体
バリアント
特性体 ... mixin 実現
トレイト境界 → 特性制約?
実装 特性化?
特性関数?
ジェネリクス
データ構造 コレクション?
タプル
配列
スレッド
ユニットテスト
テストモジュール
テスト関数
属性
エラー処理
todo
実装項目
API 設計
unsafe 機能 (いつ導入?)
memo
マクロの扱い
仕様書の全構文を追えるように構文例に印と分類をつける
コーディングスタイル 強制度
弱 推奨 守ったほうが優れたプログラムを書けるが警告やエラーは出ず問題なくコンパイルができる
中 非推奨 警告 記述ミスなどの問題を誘発する可能性があるためコンパイルはできるが警告が出る
強 禁止 エラー 致命的な問題となるため禁止されコンパイルができない
コンパイルログ
通知 バージョン通知等
警告
エラー
ブロック構造
宣言や式をブロック単位に分割する機能
利用目的
内含要素のグループ化
内含要素のスコープ制限
変数ライフタイムの評価 ライフタイムを参照
end キーワードを使う宣言ブロックと波括弧を使うブロック式のニ種類
宣言ブロック
モジュールや関数などの宣言に用いる
内含要素はブロック宣言のみ ... 宣言する要素によって内含できる宣言が異なる
スコープはアクセス修飾子に依存
構文例
ブロック式
複数式の一体化に用いる
1つの式として利用できる
内含要素は式のみ
スコープ ... 自身及び祖先のブロック ただし祖先に関しては自身の式ブロックを使用するより前の範囲に限定される
構文例
式
文は存在しない
丸括弧で1つの式を括ることができる
優先度の異なる演算子を繋げる時は優先度の高さに関わらず括ることが推奨 1+(2*3)のように
式一覧 識別子 関数呼び出し
式に式を含ませる ifなど
リテラル
識別子
命名規則
正規表現ルール [a-zA-Z_][a-zA-Z0-9_]* に基づく
予約語でない
関数 変数 構造体 列挙体 等の命名規則
予約語一覧
演算子
演算子一覧
結合方向
優先度
モジュール
use 宣言
変数
Rust からの影響
束縛
所有権
所有権があれば値にアクセスできる
所有者は常に一つ
変数スコープを外れると破棄 (ドロップ) される
コピー
自動コピー 値を別の変数に束縛する際に暗黙的にコピーする AutoCopy 特性体
基本型と不変参照 (Ref) 型
フリーズ
可変借用中の変数スコープでは借用元の変数の可変参照を再度作成できない
参照
可変参照は1つのみ
可変変数を不変変数に弱化できるが不変参照は可変参照に強化できない
不変変数は可変参照化できない
参照外し
値にアクセスできるが変更はできない
借用
可変借用
実質的に所有権が移動した状態
借用後
データ型
強い静的型付け言語
極力プログラマが把握できる形で明示的に型変換する
基本型
ssize usize
配列
タプル
列挙型
構造型 (オブジェクト型)
明示的型変換
as 演算子
as で変換できる型
数値型
To From トレイト
暗黙的型変換
数値型
デフォルトの型 s32 f32 を持つ
To<str> トレイトを実装する型
文字列の式展開時に限る
型推論
文脈から型を暗黙的に決定する
ユーザが明示する必要がない
同じことを2度書かなくていい、記述量を減らす目的
型明示がないと数値型は s32 f32 と推論される
引数渡し, 変数代入等で式が評価される際に推論される
型エイリアス 型に別名をつける
型定義を集約
型の役割を型名で説明
if
if-then-else (簡略 if?)
if true then true else false
code:if
if true {
put true
} elif {
put false
}
メモ
code:式一覧
- 演算式(../../../../inprep/index.md) - if 式(../../../../inprep/index.md) - match 式(../../../../inprep/index.md) - loop 式(../../../../inprep/index.md) - for 式(../../../../inprep/index.md) - while 式(../../../../inprep/index.md) - 変数定義式(../../../../inprep/index.md) - 変数初期化式(../../../../inprep/index.md) - ラムダ式(../../../../inprep/index.md) - put 式
エラー移譲演算子
as 演算子
名前付きタプル
アイテムの名称
「特性体を実装する」の表現
self参照引数のライフタイム推論
ブロック式 式が一つならput省略
リテラル 'a'u8 ?
数値リテラル 1e10
code:mod
モジュールを定義するには モジュール名.ches を作成してファイル内にモジュール内要素を記述するか、mod キーワードによってモジュールブロックを記述する必要があり、それぞれ「モジュールファイル」、「モジュールブロック」と呼ぶ。
モジュールファイル内の要素を利用するには親モジュールで mod 宣言をする必要がある。
ファイルとモジュール基本的にモジュールファイルのみを利用すべきである。
内部的に考えると、可変借用は一時的に所有権を他の変数に移動して変数スコープを出た時に自動で所有権を返却する仕組みともいえる。
code:所有権
変数に束縛された値にはそれぞれ「所有者」にあたる変数が存在し、所有者と値への 参照(#参照と借用) を持つ変数のみがその値にアクセスすることができる。 所有者は所有する値に対して「所有権を持つ」、他の変数に所有権を移動することを「ムーブ」と表現する。
所有権をムーブした先の変数は新しい所有者として扱われ、古い所有者からは一切の値アクセスが不可能となる。
ある値の所有者は常に 1 つであり、所有者の 変数スコープ(#変数スコープ) を抜ける際に値が破棄 (ドロップ(#ドロップ)) される。 命名規則: 変数名: 先頭の _ で未使用を明示
再束縛
変数名を再利用することで名前の汚染を防ぐ仕組み
再束縛前後で一貫して変数の型や可変性が一致している必要はない。
code:所有権
所有権は実行時のコストなく安全に効率よくメモリを管理するための仕組みである。
変数に束縛された値にはそれぞれ「所有者」にあたる変数が存在し、所有者と値への 参照(#参照と借用) を持つ変数のみがその値にアクセスすることができる。 ただし値を所有していても変数の可変性によって値へのアクセスが制限されることがある。
所有者は所有する値に対して「所有権を持つ」、他の変数に所有権を移動することを「ムーブ」と表現する。
ムーブ先の変数は新しい所有者として扱われ、古い所有者は所有権を失うため一切の値へのアクセスが不可能となる。
可変性はそれぞれの変数が持つ性質のため、ムーブ元とムーブ先で可変性が継承される保証はない。
### 所有権に関する制約
- 所有権を持たない変数からは値へのアクセスが一切できない
- 以下のケースにおいて変数に所有権が付与される
- 変数が値を束縛した場合
- 以下のケースにおいて変数から所有権が剥奪される
- 値の所有権を他の変数にムーブした場合
- それぞれの値に対応する所有者は常に 1 つ
ライフタイム: ダングリング参照を防ぐ
一つの所有者から作成できる参照の数に制限はない。
可変参照の共存不可 → 競合防止
put 排除
expr は任意 構文修正
値を省略したらvoid
定義ブロック
命名できる 構文はものによる
ブロックラベル
ブロック式を識別する
ループ内部から任意のループを break or continue
ループ構文が内含するブロック式でしか使えない
型は任意のループの値の型と一致すべき
現在のところ任意のブロックへのputは制御構造を複雑にする→デバッグ困難のため認められない
モジュール