• Save
Rust samurai#01
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Rust samurai#01

  • 1,189 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,189
On Slideshare
1,134
From Embeds
55
Number of Embeds
2

Actions

Shares
Downloads
0
Comments
0
Likes
2

Embeds 55

http://chikoski.info 36
https://twitter.com 19

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Rust の話http://www.flickr.com/photos/lifeontheedge/246608863
  • 2. about:me
  • 3. • 所属• Mozilla Japan マーケティング部• 慶應義塾大学 特別研究教員• @chikoski• プログラミング言語が好き• JavaScript, Ruby, R清水智公 (しみずのりただ)
  • 4. Rust
  • 5. Its design is oriented toward concerns of“programming in the large”, that is,of creating and maintaining boundaries– both abstract and operational –that preserve large-systemintegrity, availability and concurrency.
  • 6. Rust の機能的な特徴• 強い型システムと型推論• タスクベースの並行プログラミング• 高階関数、クロージャ• パターンマッチ• 多相性
  • 7. C言語一門のような文法• {} によるコードブロックの定義• if , while による制御• 関数定義と関数呼び出し• main 関数
  • 8. Rust• http://www.rust-lang.org/• 利用できる環境• Windows (7, Server 2008 R2), x86• Linux, x86 / x86-64• OS X 10.6 以降, x86 / x86-64
  • 9. エディタ• Emacs : src/etc/emacs• Vim :https://github.com/mozilla/rust/blob/master/src/etc/vim/syntax/rust.vimhttps://github.com/wting/rust.vim• Sublime:https://github.com/dbp/sublime-rust
  • 10. 今日の内容
  • 11. 今日の内容• Hello, World• 変数宣言• 制御構造• 関数定義と呼び出し
  • 12. version 0.6 のお話です
  • 13. Hello, World
  • 14. Hello, Worldfn main(){io::println("Hello, World!");}
  • 15. 変数
  • 16. let hi = "hi";let mut count = 0;while count < 10 {io::println(fmt!("count: %?", count));count += 1;}ローカル変数の宣言
  • 17. let hi = "hi";let mut count = 0;while count < 10 {io::println(fmt!("count: %?", count));count += 1;}単一代入
  • 18. let hi = "hi";let mut count = 0;while count < 10 {io::println(fmt!("count: %?", count));count += 1;}mutable な変数の宣言
  • 19. ブロックスコープfn main(){let a = 1;{let b = 2;io::println(int::to_str(a));io::println(int::to_str(b));}io::println(int::to_str(b));}
  • 20. ブロックスコープfn main(){let a = 1;{let b = 2;io::println(int::to_str(a));io::println(int::to_str(b));}io::println(int::to_str(b));}unresolved name: `b`
  • 21. グローバル変数はないa = 10;fn main(){io::println(int::to_str(a));}
  • 22. グローバル変数はないa = 10;fn main(){io::println(int::to_str(a));}expected item but found `a`
  • 23. グローバル変数はないlet a = 10;fn main(){io::println(int::to_str(a));}
  • 24. グローバル変数はないlet a = 10;fn main(){io::println(int::to_str(a));}expected item but found `let`
  • 25. 定数宣言static a: int = 10;fn main(){io::println(int::to_str(a));}
  • 26. 定数宣言時の型宣言は省略できないstatic a = 10;fn main(){io::println(int::to_str(a));}
  • 27. 定数宣言時の型宣言は省略できないstatic a = 10;fn main(){io::println(int::to_str(a));}expected `:` but found `=`
  • 28. 定数と同名の変数は宣言できないstatic a: int = 10;fn main(){let a = 5;io::println(int::to_str(a));}
  • 29. 定数と同名の変数は宣言できないstatic a: int = 10;fn main(){let a = 5;io::println(int::to_str(a));}only refutable patterns allowed here
  • 30. static factor: float = 57.8;let size = factor * 10.0;let size: int = 50;let _size = 50;変数宣言時の型推論
  • 31. 制御構造
  • 32. let price = 0;if item == "salad" {price = 3.50;} else if item == "muffin" {price = 2.25;} else {price = 2.00;};条件分岐
  • 33. let price =if item == "salad" {3.50} else if item == "muffin" {2.25} else {2.00};if 文ではなく if 式
  • 34. fizzbuzzlet msg = if(n % 15 == 0){"FizzBuzz"}else if(n % 3 == 0){"Fizz"}else if(n % 5 == 0){"Buzz"}else{""};
  • 35. パターンマッチmatch my_number {0 => io::println("0"),1 | 2 => io::println("1 / 2"),3..10 => io::println("3 - 10"),_ => io::println("?")}
  • 36. match n {n if n % 15 == 0 => "FizzBuzz",n if n % 5 == 0 => "Buzz",n if n % 3 == 0 => "Fizz",_ => ""}fizzbuzz (with pattern match)
  • 37. match n {n if n % 15 == 0 => "FizzBuzz",n if n % 5 == 0 => "Buzz",n if n % 3 == 0 => "Fizz",_ => ""}ガード節
  • 38. 繰り返しlet mut n = 1;while n < 100 {let r = fizzbuzz(n);io::println(fmt!("%? : %s", n, r));n = n + 1;}
  • 39. loop ⇔ while(true)let mut x = 5;loop {x += x - 3;if x % 5 == 0 { break; }io::println(int::to_str(x));}
  • 40. 関数定義
  • 41. 関数呼び出しfn main(){let a = line(1, 0, 1);io::println(int::to_str(a));}
  • 42. 関数定義fn line(a: int, b: int, x: int) -> int {return a * x + b;}
  • 43. return は省略できるfn line(a: int, b: int, x: int) -> int {a * x + b}
  • 44. ;の有無に注意fn line(a: int, b: int, x: int) -> int {a * x + b;}() が返り値になる
  • 45. いろいろ試してみた• 引数の型は省略できるか?• 返り値の型は省略できるか?• 関数内で関数定義できるか?• 無名の関数は定義できるか?• 関数名の重複は許されるか?
  • 46. 引数の型は省略できないfn line(a, b, x){a * x + b}
  • 47. 返り値の型は省略できるがfn line(a: int, b: int, x: int){a * x + b}
  • 48. 返り値の型は省略できるがfn line(a: int, b: int, x: int){a * x + b}mismatched types: expected `()` but found`int` (expected () but found int)
  • 49. 関数内関数(JavaScript の場合)function line(a, b, x){funciton add(a, b){return a + b;}return add(a * x, b);}
  • 50. 関数内で関数を宣言できるfn line(a: int, b: int, x: int) -> int{fn add(a: int, b: int) -> int{return a + b}add(a * x, b)}
  • 51. 外部の変数を参照できないfn line(a: int, b: int, x: int) -> int{fn add(a: int) -> int{return a + b}add(a * x)}
  • 52. 外部の変数を参照できないfn line(a: int, b: int, x: int) -> int{fn add(a: int) -> int{return a + b}add(a * x)}この b は外側の環境にある
  • 53. 外部の変数を参照できないfn line(a: int, b: int, x: int) -> int{fn add(a: int) -> int{return a + b}add(a * x)}attempted dynamic environment-capture
  • 54. 無名関数(JavaScript の場合)function line(a, b, x){(function(a, b){return a + b;})(a * x, b);}
  • 55. 無名関数は作成できない(?)fn line(a: int, b: int, x: int) -> int{(fn(a: int, b: int) -> int{return a + b})(a * x, b)}
  • 56. 無名関数は作成できない(?)fn line(a: int, b: int, x: int) -> int{(fn(a: int, b: int) -> int{return a + b})(a * x, b)}found `fn` in ident position
  • 57. 関数名の重複(Java の場合)public static int line(int a, int b, int x){return a * x + b;}public static float line(float a, float b, float x){return a * x + b;}
  • 58. 関数名の重複は許されないfn line(a: int, b: int, x: int) -> int {a * x + b}fn line(a: float, b: float, x: float)-> float {a * x + b}
  • 59. 関数名の重複は許されないfn line(a: int, b: int, x: int) -> int {a * x + b}fn line(a: float, b: float, x: float)-> float {a * x + b}duplicate definition of value line
  • 60. 高階関数fn line(a: int, b: int, x: int, link: &fn(int) -> int) -> int{a * link(x) + b}fn offset(x: int) -> int{x + 2}fn main(){let a = line(1, 0, 1, offset);io::println(int::to_str(a));}
  • 61. まとめ
  • 62. まとめ• 変数• mut をつけないと mutable にならない• グローバル変数なし• 条件分岐:if, match• 繰り返し:while, loop
  • 63. 関数について• 型はかならず書かなければならない• 関数内で関数を定義できる• 無名の関数は定義できない• 外部の環境を参照できない• クロージャ使え• 高階関数
  • 64. 本性は関数型言語
  • 65. おまけと次回予告
  • 66. Rust 情報源• 公式サイト:http://www.rust-lang.org/• メーリングリスト:https://mail.mozilla.org/listinfo/rust-dev• This Week in Rust:http://cmr.github.io/• pcwalton:http://pcwalton.github.io/• http://www.rust-.lang.jp/ドメインだけ押さえた!翻訳者募集!
  • 67. 次回予告• box• ユーザ定義型• タプル• 構造体、列挙型• オブジェクト思考• 型推論のお話