Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
セミコロン完全マスター
Search
Masaki Hara
March 12, 2019
Programming
6
3.5k
セミコロン完全マスター
セミコロンに関する蘊蓄です
Masaki Hara
March 12, 2019
Tweet
Share
More Decks by Masaki Hara
See All by Masaki Hara
バックエンドのためのアプリ内課金入門 (サブスク編)
qnighy
8
1.8k
Dockerfileの考え方
qnighy
45
17k
Arm移行タイムアタック
qnighy
1
510
Quine, Polyglot, 良いコード
qnighy
5
740
Prolog入門
qnighy
5
1.5k
Rubyのobject_id
qnighy
6
1.6k
Getting along with YAML comments with Psych
qnighy
2
2.3k
状態設計から「なんとなく」を無くそう
qnighy
85
28k
日付時刻A to Z
qnighy
1
640
Other Decks in Programming
See All in Programming
ペアーズでの、Langfuseを中心とした評価ドリブンなリリースサイクルのご紹介
fukubaka0825
2
320
ISUCON14公式反省会LT: 社内ISUCONの話
astj
PRO
0
190
2,500万ユーザーを支えるSREチームの6年間のスクラムのカイゼン
honmarkhunt
6
5.3k
Flutter × Firebase Genkit で加速する生成 AI アプリ開発
coborinai
0
150
ファインディLT_ポケモン対戦の定量的分析
fufufukakaka
0
680
CNCF Project の作者が考えている OSS の運営
utam0k
6
710
sappoRo.R #12 初心者セッション
kosugitti
0
250
XStateを用いた堅牢なReact Components設計~複雑なClient Stateをシンプルに~ @React Tokyo ミートアップ #2
kfurusho
1
890
Amazon Bedrock Multi Agentsを試してきた
tm2
1
280
Spring gRPC について / About Spring gRPC
mackey0225
0
220
Pulsar2 を雰囲気で使ってみよう
anoken
0
230
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
10
3.5k
Featured
See All Featured
Designing for Performance
lara
604
68k
Navigating Team Friction
lara
183
15k
How to train your dragon (web standard)
notwaldorf
91
5.8k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.3k
Bootstrapping a Software Product
garrettdimon
PRO
306
110k
Optimizing for Happiness
mojombo
376
70k
Code Reviewing Like a Champion
maltzj
521
39k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.6k
It's Worth the Effort
3n
184
28k
Testing 201, or: Great Expectations
jmmastey
42
7.2k
Transcript
2019/3/12 1 セミコロン完全マスター Rust セミコロン完全マスター @qnighy 原 将己 (Wantedly株式会社) shinjuku.rs
#3 @FORCIA 2019-03-12
2019/3/12 2 セミコロン完全マスター 話す内容 • 最近色々忙しくてRustを書けてないので、いつものように蘊蓄 を話します • セミコロンで迷わなくなります (たぶん)
2019/3/12 3 セミコロン完全マスター セミコロンの用途 アイテム類の終端記号 fn foo(); 文の終端記号 let x
= 42; 配列 宣言マクロの腕 ($e:expr) => { $e * 2 }; [i32; 42] [0; 42]
2019/3/12 4 セミコロン完全マスター 配列型と繰り返し構文 • 元々は [0, ..42] という構文だったものがRFC0520で変更に なった経緯がある
[i32; 42] [0; 42]
2019/3/12 5 セミコロン完全マスター セミコロンの用途 アイテム類の終端記号 fn foo(); 文の終端記号 let x
= 42; 配列 宣言マクロの腕 ($e:expr) => { $e * 2 }; [i32; 42] [0; 42]
2019/3/12 6 セミコロン完全マスター 宣言マクロの腕 macro_rules! foo { () => {
foo!(42) }; ($x:expr) => {}; }
2019/3/12 7 セミコロン完全マスター セミコロンの用途 アイテム類の終端記号 fn foo(); 文の終端記号 let x
= 42; 配列 宣言マクロの腕 ($e:expr) => { $e * 2 }; [i32; 42] [0; 42]
2019/3/12 8 セミコロン完全マスター なぜセミコロン終端? 終端記号が必須 Rust, C, C++, Java, C#,
Perl, Prolog 改行終端が可能 Ruby, Python, JavaScript, Go, Swift, Haskell, VB 終端が不要 OCaml 括弧 Scheme
2019/3/12 9 セミコロン完全マスター なぜセミコロン終端? • 最近もURLOにその話題があった https://users.rust- lang.org/t/why-semicolons/25074 • 端的に言えば……
暗黙のreturnとの相性のため & 構文的な複雑性の回避
2019/3/12 10 セミコロン完全マスター 暗黙のreturn { let x = 42; println!("{}",
x); x } 文 文 式 (戻り値)
2019/3/12 11 セミコロン完全マスター 暗黙のreturn { let x = 42; println!("{}",
x); x; } 文 文 文 最後の値を使うかどうかが明確なので、 人間にもコンパイラにも優しいと考えられている
2019/3/12 12 セミコロン完全マスター 構文的な複雑性の回避 自動セミコロン挿入は 構文が複雑になりがち ……というようなことが よく主張される
2019/3/12 13 セミコロン完全マスター Pythonの改行の扱い • 字句解析のシンプルなルールで記述されている • 原則として改行 = 文終端
• 括弧の中では改行を無視 • 文末がバックスペースなら 続く改行を無視 ……しかし、Pythonは文と式が交互にネストしない という特殊事情がある
2019/3/12 14 セミコロン完全マスター JavaScriptの改行の扱い • 構文エラーで駆動(ECMA-262 ECMAScript 2018, §11.9) •
改行位置で構文エラーが起きたら セミコロンを挿入する
2019/3/12 15 セミコロン完全マスター Haskellの改行の扱い • 基本は字句解析の仕事だが、 部分的に構文エラーで駆動(Haskell 2010, §2.7) •
インデントが同じだったら セミコロンを挿入する • 構文エラーで必要に応じて } を挿入する
2019/3/12 16 セミコロン完全マスター 構文的な複雑性の回避 — 私見 自動セミコロン挿入は 構文が複雑になりがち 改行を条件つきで使用する仕組みはどうしても構文全体と 相互作用してしまうので、やはり複雑性のコストは高そう
特にRustのマクロはトークン列を入力とするので難しそう
2019/3/12 17 セミコロン完全マスター セミコロンの用途 アイテム類の終端記号 fn foo(); 文の終端記号 let x
= 42; 配列 宣言マクロの腕 ($e:expr) => { $e * 2 }; [i32; 42] [0; 42]
2019/3/12 18 セミコロン完全マスター アイテム類とは extern crate, mod, use, impl, trait,
type, struct, enum, static, const, fn const, type, fn 真正なアイテム ルートや mod 内に書ける トレイトアイテム trait {} 内に書ける const, type, fn 実装アイテム impl {} 内に書ける static, type, fn 外部アイテム extern {} 内に書ける など
2019/3/12 19 セミコロン完全マスター アイテム類の終端記号 ; OR 排他規則 {} struct Color
{ red: u8; green: u8; blue: u8; } struct Color(u8, u8, u8);
2019/3/12 20 セミコロン完全マスター アイテム類の終端記号 ; OR 排他規則…の例外? {} use serde::{Deserialize,
Serialize};
2019/3/12 21 セミコロン完全マスター アイテム類の終端記号 ; OR 排他規則…の例外? {} use serde::{Deserialize,
Serialize}; use serde::*; } はuse構文自体に由来するものではない 引数の一部としてたまたま出てきただけ ……と解釈されている
2019/3/12 22 セミコロン完全マスター セミコロンの用途 アイテム類の終端記号 fn foo(); 文の終端記号 let x
= 42; 配列 宣言マクロの腕 ($e:expr) => { $e * 2 }; [i32; 42] [0; 42]
2019/3/12 23 セミコロン完全マスター 復習: 暗黙のreturn { let x = 42;
println!("{}", x); x } 文 文 式 (戻り値) セミコロン終端 = その値を使わない という解釈 ブロック末尾以外はセミコロンが来ない??
2019/3/12 24 セミコロン完全マスター 文終端の原則 文は原則としてセミコロンで終端する。 しかし…… ➢ 暗黙のreturn のためには最終文のセミコロンの省略が必須。 文は式文なら何でもよい。
➢ {} OR ; 排他規則 のために文のセミコロンの省略が可能。 文は特定のブロック式である必要がある。 型は () である必要がある。
2019/3/12 25 セミコロン完全マスター 末尾以外のセミコロン省略 if true { 42; } else
{ 53; }; println!("Hello!"); どちらか片方は残す必要がある。 セミコロンがなければ 型がついてしまうからだ。
2019/3/12 26 セミコロン完全マスター 接頭辞禁止規則 x = if true { 42
} else { 53 } println!("Hello!"); ここで区切っても if文にはならない
2019/3/12 27 セミコロン完全マスター セミコロン省略規則の罠 if true { 42 } else
{ 53 } - 1; println!("Hello!"); これはコンパイルが通らない。 中置・前置演算子を式文として使うことは ほぼないので、気にすることはあまりない
2019/3/12 28 セミコロン完全マスター マクロとセミコロン マクロ呼び出しの構文は文脈によって微妙に異なる アイテム類マクロ 文マクロ 式類マクロ foo!(); foo![];
foo!{} foo!(); foo![]; foo!{}; foo!() foo![] foo!{} foo!{} セミコロンあり セミコロンなし foo! ident (); foo! ident []; foo! ident {} マクロ定義用構文 ※ () と [] は完全互換
2019/3/12 29 セミコロン完全マスター アイテム類マクロ macro_rules! foo { ($x:ident) => {
fn $x() {} } } foo!(f1); foo![f2]; foo! { f3 } {} OR ; 排他規則で説明できる
2019/3/12 30 セミコロン完全マスター 式類マクロ macro_rules! foo { () => {
42 } } (foo!()); (foo![]); (foo!{}); セミコロンをつけないので 全部同じ
2019/3/12 31 セミコロン完全マスター これは? fn main() { dbg!(42); let x
= dbg!(42); } 文マクロ 式マクロ
2019/3/12 32 セミコロン完全マスター 文マクロの展開規則 fn main() { dbg! { 42
} // Bad! dbg! { 42 }; // Good! dbg!(42); // Good! } セミコロンがついたときは、 展開後の文リストの最後の文に セミコロンを付加する ※RustのマクロはASTの構造に沿って行われるので、 「セミコロンを付加する」というのは特例的な操作になる
2019/3/12 33 セミコロン完全マスター まとめと宣伝 セミコロンひとつとっても色々な設計判断が見える • {} OR ; 排他規則
• 暗黙のreturnのための規則 • 文マクロと式マクロが整合するための規則 • etc...
2019/3/12 34 セミコロン完全マスター まとめと宣伝 こういう蘊蓄をまとめた本を作っています 技術書典に出せるよう計画中!