Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
セミコロン完全マスター
Search
Masaki Hara
March 12, 2019
Programming
6
3.7k
セミコロン完全マスター
セミコロンに関する蘊蓄です
Masaki Hara
March 12, 2019
Tweet
Share
More Decks by Masaki Hara
See All by Masaki Hara
バックエンドのためのアプリ内課金入門 (サブスク編)
qnighy
9
2.3k
Dockerfileの考え方
qnighy
49
19k
Arm移行タイムアタック
qnighy
1
630
Quine, Polyglot, 良いコード
qnighy
5
830
Prolog入門
qnighy
5
2.4k
Rubyのobject_id
qnighy
7
1.8k
Getting along with YAML comments with Psych
qnighy
2
2.8k
状態設計から「なんとなく」を無くそう
qnighy
86
29k
日付時刻A to Z
qnighy
2
880
Other Decks in Programming
See All in Programming
新卒エンジニアのプルリクエスト with AI駆動
fukunaga2025
0
230
エディターってAIで操作できるんだぜ
kis9a
0
730
大体よく分かるscala.collection.immutable.HashMap ~ Compressed Hash-Array Mapped Prefix-tree (CHAMP) ~
matsu_chara
2
220
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
430
実は歴史的なアップデートだと思う AWS Interconnect - multicloud
maroon1st
0
210
開発に寄りそう自動テストの実現
goyoki
2
1k
【CA.ai #3】ワークフローから見直すAIエージェント — 必要な場面と“選ばない”判断
satoaoaka
0
250
ゲームの物理 剛体編
fadis
0
350
Github Copilotのチャット履歴ビューワーを作りました~WPF、dotnet10もあるよ~ #clrh111
katsuyuzu
0
110
AIエンジニアリングのご紹介 / Introduction to AI Engineering
rkaga
8
2.9k
Your Architecture as a Crime Scene?Forensic Analysis
manfredsteyer
PRO
0
100
JETLS.jl ─ A New Language Server for Julia
abap34
1
410
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
97
6.4k
Done Done
chrislema
186
16k
Speed Design
sergeychernyshev
33
1.4k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.1k
Art, The Web, and Tiny UX
lynnandtonic
304
21k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
1
100
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
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 セミコロン完全マスター まとめと宣伝 こういう蘊蓄をまとめた本を作っています 技術書典に出せるよう計画中!