Slide 1

Slide 1 text

自然数を定義してみよう Mozilla Japan N.Shimizu ([email protected]) Rust初心者LT会@レバレジーズ (2016/11/21)

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

https://hacks.mozilla.org/2016/11/rust-and-the-future-of-systems-programming/

Slide 4

Slide 4 text

https://www.youtube.com/watch?list=PLo3w8EB99pqJ74XIGe72c9hBZWz9Y16cY&v=8EPsnf_ZYU0

Slide 5

Slide 5 text

荈搫侧㥨ֹדׅ״י

Slide 6

Slide 6 text

3VTUד荈搫侧׾㹀纏׃ג׫״ֲ

Slide 7

Slide 7 text

/4IJNJ[V!DIJLPTLJ ˖ ⛆加㖩ח֮׷8FC׾⡲׷⠓爡ד⫴ְגְתׅ ˖ 'JSFGPY'JSFGPYGPSJ04 ˖ 3VTUBTNKT8FC"TTFNCMZ8FC73(BNJOH ˖ .%/TVQQPSUNP[JMMBPSH ˖ فؚٗٓىؚٝ鎉铂ה؟حؕ٦鋅׷ךָ㥨ֹדׅ ˖ 㘗ך䓼ְ鎉铂ָ㥨ֹדׅ ˖ IUUQTTQFBLFSEFDLDPNDIJLPTLJ

Slide 8

Slide 8 text

自然数など定義して何になるのか

Slide 9

Slide 9 text

自然数の定義:良いプログラミングの練習 • 直和型をどのように扱うか? • Cでは共用体として表現 • Javaでは継承、もしくはインタフェースの実装で実現 • JavaScriptやRubyはあるメソッドを持っているかどうか • 再帰的なデータ構造をどのように扱うか? • Cでは共用体へのポインターを利用して実現 • JavaではCompositeパターンを使って実装 • JavaScriptやRubyでは、とりあえず代入すればいい • 再帰的な関数をどのように定義できるか?

Slide 10

Slide 10 text

ペアノの公理:自然数の定義 • ジュゼッペ・ペアノ(1858-1932)によって定義された自然数の定義 (1891) • 自然数は次の条件を満たす • 自然数0が存在する • 任意の自然数 a には、その後者 suc(a) が存在する • 0はいかなる自然数の後者ではない • 異なる自然数は、異なる後者を持つ • 0がある性質を満たし、a がある性質を満たせば suc(a) もまたその性質を満 たす時、全ての自然数はその性質を満たす IUUQTKBXJLJQFEJBPSHXJLJآُئحل٥ل،ظ

Slide 11

Slide 11 text

自然数の構造:はじまりの町と、つぎの町 • スタート地点と、次の地点への移動で定義されるもののことを「自然数」と呼びました • 0:スタート地点 • 後者関数suc: 次の地点への移動 • 線形リストと同じ構造を持ちます TVD TVD TVD TVD

Slide 12

Slide 12 text

JS DMBTT1FBOP\ DPOTUSVDUPS QSFW \ UIJTQSFWQSFW ^ TVD \ SFUVSOOFX1FBOP UIJT ^ UP@J \ SFUVSOUIJTQSFW UIJTQSFWUP@J ^ ^ 1FBOP@[FSPOFX1FBOP OVMM 1FBOP[FSPGVODUJPO \ SFUVSO1FBOP@[FSP ^ DPOTU[FSP1FBOP[FSP DPOTUPOF[FSPTVD DPOTUUXPPOFTVD DPOTUGPVSUXPTVD TVD DPOTPMFMPH GPVSUP@J JavaScript で定義した自然数クラス

Slide 13

Slide 13 text

コマンドライン DBSHPOFXCJOQFBOP USFFQFBOP QFBOP щЭЭ$BSHPMPDL щЭЭ$BSHPUPNM сЭЭTSD сЭЭNBJOST Cargo コマンドで雛形を作成

Slide 14

Slide 14 text

FOVN1FBOP\ ;FSP 4VD ^ GO[FSP 1FBOP\ 1FBOP;FSP ^ TVD TVD 基底となる0と、それ以外とを分けて扱えるように型を定義します  Rust

Slide 15

Slide 15 text

Rust GOUFTU@[FSP \ BTTFSU NBUDI[FSP \ 1FBOP;FSPUSVF @GBMTF ^ ^ zero() のテストコード(enum は == で同値であることを比較できません)

Slide 16

Slide 16 text

コマンドライン DBSHPUFTU $PNQJMJOHQFBOPW MF6TFSTDIJLPHJUSVTUIBOETPOTBNQMFTQFBOP XBSOJOHWBSJBOUJTOFWFSVTFEA4VDA POCZEFGBVMU TSDNBJOST ] ]4VD ]??? 'JOJTIFEEFCVHUBSHFU T JOTFDT 3VOOJOHUBSHFUEFCVHQFBOPBEBE SVOOJOHUFTU UFTUUFTU@[FSPPL UFTUSFTVMUPLQBTTFEGBJMFEJHOPSFENFBTVSFE cargo test でテストを実行できます

Slide 17

Slide 17 text

Rust GOUFTU@UP@J \ BTTFSU [FSP UP@J ^ JNQM1FBOP\ GOUP@J TFMG V\ NBUDITFMG\ 1FBOP;FSP @ ^ ^ ^ to_iメソッド:数値との対応付けを行うメソッド

Slide 18

Slide 18 text

再帰的に定義されている感を出したい • 1:= suc(0) • 2:= suc(1) = suc(suc(0)) • 3:= suc(2) = suc(suc(1)) = suc(suc(suc(0))) • 4:= suc(3) = suc(suc(2)) = suc(suc(suc(1))) = suc(suc(suc(suc(0)))) TVD TVD TVD TVD

Slide 19

Slide 19 text

Rust FOVN1FBOP\ ;FSP 4VD 1FBOP ^ GOTVD O1FBOP 1FBOP\ 1FBOP4VD O ^ GOUFTU@TVD \ BTTFSU NBUDITVD [FSP \ 1FBOP4VD @ USVF @GBMTF ^ ^ 一つ前を覚えておくことで、再帰的に定義されている感を出していこうとしました

Slide 20

Slide 20 text

コマンドライン DBSHPUFTU $PNQJMJOHQFBOPW MF6TFSTDIJLPHJUSVTUIBOETPO TBNQMFTQFBOP FSSPS<&>SFDVSTJWFUZQFA1FBOPAIBTJOOJUFTJ[F TSDNBJOST ] ]FOVN1FBOP\ ]?SFDVSTJWFUZQFIBTJOOJUFTJ[F ] IFMQJOTFSUJOEJSFDUJPO FH BA#PYA A3DA PSAA BUTPNF QPJOUUPNBLFA1FBOPASFQSFTFOUBCMF 再帰的な構造を使うには、直接値を保持するのではなく、間接的に扱わなければなりません

Slide 21

Slide 21 text

Rust FOVN1FBOP\ ;FSP 4VD 1FBOP ^ GOTVD O1FBOP 1FBOP\ 1FBOP4VD O ^ GOUFTU@TVD \ BTTFSU NBUDITVD [FSP \ 1FBOP4VD @ USVF @GBMTF ^ ^ 参照を利用して、間接的に値を保持するように書き換えます

Slide 22

Slide 22 text

コマンドライン DBSHPUFTU $PNQJMJOHQFBOPW MF6TFSTDIJLPHJUSVTUIBOETPO TBNQMFTQFBOP FSSPS<&>NJTTJOHMJGFUJNFTQFDJFS TSDNBJOST ] ]4VD 1FBOP ]?FYQFDUFEMJGFUJNFQBSBNFUFS ライフタイムを指定しなければならない!!ライフタイムってなんや!

Slide 23

Slide 23 text

ライフタイム (lifetime) • Rustは、コンパイラーでできる限りのことをしようとします。 • そのうちの一つが、オブジェクトの生存時間管理です • RustにはGC(Garbage Collection)が標準では付いていません • しかし、メモリ上の領域を解放するタイミングはコンパイラーが適切に判断してくれます • しかしながら、全てを自動では推測できないので、ヒント情報が必要です • ヒント情報を関数、構造体、traitなどの宣言時に明示できます 如ך鸬甧倯玎䒭׾הֹծZך⦼׾実׭גֻ׌ְׁ YBC CB ZYB

Slide 24

Slide 24 text

JNQMJDJU GOGPP YJ \ ^ FYQMJDJU GOCBSB YBJ \ ^ lifetimeもコンパイラーが適切に推測してくれるので、基本的に書かなくても良い

Slide 25

Slide 25 text

TUSVDU'PPB\ YBJ ^ GONBJO \ MFUZUIJTJTUIFTBNFBTAMFU@ZMFUZ@ZA MFUG'PP\YZ^ QSJOUMO \^ GY ^ 構造体 Foo は 'a というライフタイムを持っていて、そのメンバー x のライフタイムは'a

Slide 26

Slide 26 text

TUSVDU'PPB\ YBJ ^ JNQMB'PPB\ GOY TFMG BJ\TFMGY^ ^ Fooでは'aというライフタイムがあり、そのメソッドxの返り値は、呼び出しされたオブジェクトと同じライフタイムを持ちます

Slide 27

Slide 27 text

MFU[[FSP MFUPOF[TVD MFUUXPPOFTVD MFUUISFFUXPTVD QSJOUMO \^\^\^\^ [UP@J POFUP@J UXPUP@J UISFFUP@J MFU[[FSP MFUPOF[TVD MFUUISFF \ MFUUXPPOFTVD UISFFUXPTVD QSJOUMO \^\^\^\^ [UP@J POFUP@J UXPUP@J UISFFUP@J ^ 左はコンパイルできますが、右はライフタイムに関するエラーがあるのでコンパイルできません

Slide 28

Slide 28 text

Rust FOVN1FBOPB\ ;FSP 4VD B1FBOPB ^ GO[FSPB 1FBOPB\ 1FBOP;FSP ^ GOTVDB OB1FBOP 1FBOPB\ 1FBOP4VD O ^ ライフタイムを明示してみました

Slide 29

Slide 29 text

Rust JNQMB1FBOPB\ GOUP@J TFMG V\ NBUDITFMG\ 1FBOP;FSP @ ^ ^ ^ ライフタイムの明示(つづき)

Slide 30

Slide 30 text

Rust JNQMB1FBOPB\ GOUP@J TFMG V\ NBUDITFMG\ 1FBOP;FSP @ ^ ^ GOTVD BTFMG 1FBOPB\ 1FBOP4VD TFMG ^ ^ GOUFTU@TVD \ BTTFSU NBUDI[FSP TVD \ 1FBOP4VD @ USVF @GBMTF ^ ^ suc をメソッド化

Slide 31

Slide 31 text

Rust JNQMB1FBOPB\ GOUP@J TFMG V\ NBUDITFMG\ 1FBOP;FSP 1FBOP4VD QSFW QSFWUP@J ^ ^ ^ 数値との対応付け(再帰的に行う)

Slide 32

Slide 32 text

まとめ • ここまで、Rustを使って自然数を定義できました • これからやりたいこと • 各種演算の実装(加算、乗算、除算) • エラーメッセージをよく読もう!Rustのエラーメッセージは親切!まじ親切!

Slide 33

Slide 33 text

https://doc.rust-lang.org/error-index.html

Slide 34

Slide 34 text

https://dev.mozilla.jp/

Slide 35

Slide 35 text

goo.gl/bHALbG