2017-04-01から1ヶ月間の記事一覧

Rust構文解析器のトークン分割戦略

他の多くの言語と同様、Rustの字句解析器は貪欲にトークンを分割する。しかし構文解析の途中で必要に迫られて、さらに細かくトークンを分割する場合がある。 先にまとめ 以下の場合は、構文解析のタイミングで字句がさらに細かく分割される。 式の位置に、前…

Rustでグラフを表現するにはTyped Arenaが便利

概要: Rustでグラフのように相互参照を含むデータ構造を表現するには、Typed Arenaという方法が適している。これについて説明する 整数による表現 グラフの表現方法で、最も簡単なのは、ノードを整数で表し、グラフのデータを別に持つ方法である。 fn main()…

Rustの基本型の名前解決

Rustの基本型の名前はキーワードではない。したがって基本型の名前は名前解決と同時に処理されることになる。ところがややこしい点として、基本型と同名のモジュールに解決される場合もある。この挙動について調べた。 基本型の名前は PrimitiveTypeTable::n…

Rustのモジュールの復習

以前名前解決についてまとめたが、やはり調べ損ねている部分があるので、もう一度まとめてみた。 DefとModuleとNameBindingKind DefId はRust中に出現する定義(enum, enum のバリアント、 fn, let, macro_rules! foo など)を指している。これはcrateのID + c…

Rustの文でセミコロンを省略してよい条件

Rustの文でセミコロンを省略してよい条件を説明する。 意味論的な原則 Rustのセミコロンは意味と構文からそれぞれ説明できる。意味論的には、以下の原則を覚えておけば十分である。 セミコロンで終端された文は強制的に () 型となる。 ブロックの途中の文は …

Rust トレイトオブジェクトの生存期間境界の既定値

概要: トレイトオブジェクト型には生存期間を指定できるが、省略した場合既定値が適用される。この既定値を決定する規則について説明する。 トレイトオブジェクトの生存期間境界 トレイトオブジェクトは正確には以下の構文を持つ。 // obligation 1: only Se…

トレイトオブジェクトのメソッド解決

Rustのこのissueで知ったが、トレイトオブジェクトのメソッド解決はやや特殊らしい。 特殊といっても特に難しいことはない。トレイトオブジェクトは、元となったトレイトを実装するが、それだけではなく、元のトレイトのメソッドを、固有メソッドとしても解…

Rustで使わない変数名をつけるのとアンダースコアの微妙な違い

変数はブロックの末尾まで生存するが、アンダースコアは変数ではないためその文の中でのみ生存する。どうせ使わないからほぼ同じだが、Dropの順番が異なる。 struct A(&'static str); impl Drop for A { fn drop(&mut self) { println!("dropped: {}", self.…

Rustのstd::mem::forgetがunsafeでない理由

Rustのstd::mem::forgetはunsafeではない。このことはAPIドキュメントに説明されている。Rustのオブジェクトは二重dropしてはいけないが、dropをせずに放置する分には(少なくともメモリ保護の観点からは)安全であり、 Drop を実装する側は drop が呼ばれなく…

Rustのasm!マクロが生成するもの

Rustのasm! はインラインアセンブリを挿入するための組み込みマクロである。さて、このマクロは何を生成しているのか。 実は、RustのASTには、対応する具象構文を持たない特殊な抽象構文 InlineAsm が定義されている。 pub enum ExprKind { Box(P<Expr>), ... /// </expr>…

extern "rust-call" とは何か

extern "rust-call" は(Rust 1.16.0時点では) Fn, FnMut, FnOnce の宣言に出現する。この意味について Rust issue 41058: Get rid of the “rust-call” hack の説明がわかりやすい。 Currently, we fake variadics by defining functions with the rust-call …

Rustの多相性にかかわる構文

概要: Rustの型多相性の詳しい挙動を調べる前に、まず構文を調べる。 型仮引数 型仮引数のフォーマットは以下の通りである。 (parse_generics) < と > で囲った部分に、型仮引数の名前をカンマ区切りで指定する。 末尾のカンマは省略可能である。 型仮引数は…

Rustで挿入ソート + 強制move outで高速化

挿入ソートは時間計算量 のソートアルゴリズムであるが、特に入力 の転倒数に対して で抑えられること、また定数倍で高速なことから特定の場面で使われる場合がある。 Rustで挿入ソートを素朴に実装すると以下のようになる。 pub fn safe_insert_sort<T: Ord>(arr: &</t:>…

記事の更新頻度について

1日1回更新は一ヶ月続けることができた。ブログ駆動で色々調べる機会が得られたのはよかったが、さすがにこの頻度は大変なので、以降は2日に1回の更新にしようと思う。また、既存の記事の英訳をしてみるのもよいかもしれない。

RustのジョークRFC

Rustでは言語仕様に対する大きな変更はまずRFCという形で投稿し、十分に検討をしながらコンパイラに組み込むことになっている。(これはIETF RFCとは同名だが別のもので、 Rust RFCsで管理されている。Python PEPsと似たような仕組みといえる。) 先日、Rust R…

ハッシュベースの署名(公開鍵署名)を書いてみた

Post-Quantum Cryptography, Daniel J. Bernstein, Johannes Buchmann, and Erik Dahmen, Springer-Verlag Berlin Heidelberg, 2009の冒頭部で、ごく簡単なハッシュベースの署名アルゴリズムが紹介されていて感動したのを思い出したので書いてみた。 コード…

Rustの単一実装トレイトパターン

概要: ただ一つの実装をもつトレイトを定義するデザインパターンでできることとデメリットを紹介する。「単一実装トレイトパターン」という名前は今考えたもので、他に名前があるかもしれない。 既存の型や既存のトレイトにメソッドを追加する Rubyというプ…