Rust の話http://www.flickr.com/photos/lifeontheedge/246608863
about:me
• 所属• Mozilla Japan マーケティング部• 慶應義塾大学 特別研究教員• @chikoski• プログラミング言語が好き• JavaScript, Ruby, R清水智公 (しみずのりただ)
Rust
Its design is oriented toward concerns of“programming in the large”, that is,of creating and maintaining boundaries– both ...
Rust の機能的な特徴• 強い型システムと型推論• タスクベースの並行プログラミング• 高階関数、クロージャ• パターンマッチ• 多相性
C言語一門のような文法• {} によるコードブロックの定義• if , while による制御• 関数定義と関数呼び出し• main 関数
Rust• http://www.rust-lang.org/• 利用できる環境• Windows (7, Server 2008 R2), x86• Linux, x86 / x86-64• OS X 10.6 以降, x86 / x86-64
エディタ• Emacs : src/etc/emacs• Vim :https://github.com/mozilla/rust/blob/master/src/etc/vim/syntax/rust.vimhttps://github.co...
今日の内容
今日の内容• Hello, World• 変数宣言• 制御構造• 関数定義と呼び出し
version 0.6 のお話です
Hello, World
Hello, Worldfn main(){io::println("Hello, World!");}
変数
let hi = "hi";let mut count = 0;while count < 10 {io::println(fmt!("count: %?", count));count += 1;}ローカル変数の宣言
let hi = "hi";let mut count = 0;while count < 10 {io::println(fmt!("count: %?", count));count += 1;}単一代入
let hi = "hi";let mut count = 0;while count < 10 {io::println(fmt!("count: %?", count));count += 1;}mutable な変数の宣言
ブロックスコープ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)...
ブロックスコープ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)...
グローバル変数はないa = 10;fn main(){io::println(int::to_str(a));}
グローバル変数はないa = 10;fn main(){io::println(int::to_str(a));}expected item but found `a`
グローバル変数はないlet a = 10;fn main(){io::println(int::to_str(a));}
グローバル変数はないlet a = 10;fn main(){io::println(int::to_str(a));}expected item but found `let`
定数宣言static a: int = 10;fn main(){io::println(int::to_str(a));}
定数宣言時の型宣言は省略できないstatic a = 10;fn main(){io::println(int::to_str(a));}
定数宣言時の型宣言は省略できないstatic a = 10;fn main(){io::println(int::to_str(a));}expected `:` but found `=`
定数と同名の変数は宣言できないstatic a: int = 10;fn main(){let a = 5;io::println(int::to_str(a));}
定数と同名の変数は宣言できないstatic a: int = 10;fn main(){let a = 5;io::println(int::to_str(a));}only refutable patterns allowed here
static factor: float = 57.8;let size = factor * 10.0;let size: int = 50;let _size = 50;変数宣言時の型推論
制御構造
let price = 0;if item == "salad" {price = 3.50;} else if item == "muffin" {price = 2.25;} else {price = 2.00;};条件分岐
let price =if item == "salad" {3.50} else if item == "muffin" {2.25} else {2.00};if 文ではなく if 式
fizzbuzzlet msg = if(n % 15 == 0){"FizzBuzz"}else if(n % 3 == 0){"Fizz"}else if(n % 5 == 0){"Buzz"}else{""};
パターンマッチmatch my_number {0 => io::println("0"),1 | 2 => io::println("1 / 2"),3..10 => io::println("3 - 10"),_ => io::printl...
match n {n if n % 15 == 0 => "FizzBuzz",n if n % 5 == 0 => "Buzz",n if n % 3 == 0 => "Fizz",_ => ""}fizzbuzz (with pattern ...
match n {n if n % 15 == 0 => "FizzBuzz",n if n % 5 == 0 => "Buzz",n if n % 3 == 0 => "Fizz",_ => ""}ガード節
繰り返しlet mut n = 1;while n < 100 {let r = fizzbuzz(n);io::println(fmt!("%? : %s", n, r));n = n + 1;}
loop ⇔ while(true)let mut x = 5;loop {x += x - 3;if x % 5 == 0 { break; }io::println(int::to_str(x));}
関数定義
関数呼び出しfn main(){let a = line(1, 0, 1);io::println(int::to_str(a));}
関数定義fn line(a: int, b: int, x: int) -> int {return a * x + b;}
return は省略できるfn line(a: int, b: int, x: int) -> int {a * x + b}
;の有無に注意fn line(a: int, b: int, x: int) -> int {a * x + b;}() が返り値になる
いろいろ試してみた• 引数の型は省略できるか?• 返り値の型は省略できるか?• 関数内で関数定義できるか?• 無名の関数は定義できるか?• 関数名の重複は許されるか?
引数の型は省略できないfn line(a, b, x){a * x + b}
返り値の型は省略できるがfn line(a: int, b: int, x: int){a * x + b}
返り値の型は省略できるがfn line(a: int, b: int, x: int){a * x + b}mismatched types: expected `()` but found`int` (expected () but foun...
関数内関数(JavaScript の場合)function line(a, b, x){funciton add(a, b){return a + b;}return add(a * x, b);}
関数内で関数を宣言できるfn line(a: int, b: int, x: int) -> int{fn add(a: int, b: int) -> int{return a + b}add(a * x, b)}
外部の変数を参照できないfn line(a: int, b: int, x: int) -> int{fn add(a: int) -> int{return a + b}add(a * x)}
外部の変数を参照できないfn line(a: int, b: int, x: int) -> int{fn add(a: int) -> int{return a + b}add(a * x)}この b は外側の環境にある
外部の変数を参照できないfn line(a: int, b: int, x: int) -> int{fn add(a: int) -> int{return a + b}add(a * x)}attempted dynamic environ...
無名関数(JavaScript の場合)function line(a, b, x){(function(a, b){return a + b;})(a * x, b);}
無名関数は作成できない(?)fn line(a: int, b: int, x: int) -> int{(fn(a: int, b: int) -> int{return a + b})(a * x, b)}
無名関数は作成できない(?)fn line(a: int, b: int, x: int) -> int{(fn(a: int, b: int) -> int{return a + b})(a * x, b)}found `fn` in ide...
関数名の重複(Java の場合)public static int line(int a, int b, int x){return a * x + b;}public static float line(float a, float b, float...
関数名の重複は許されないfn line(a: int, b: int, x: int) -> int {a * x + b}fn line(a: float, b: float, x: float)-> float {a * x + b}
関数名の重複は許されないfn line(a: int, b: int, x: int) -> int {a * x + b}fn line(a: float, b: float, x: float)-> float {a * x + b}dup...
高階関数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(){...
まとめ
まとめ• 変数• mut をつけないと mutable にならない• グローバル変数なし• 条件分岐:if, match• 繰り返し:while, loop
関数について• 型はかならず書かなければならない• 関数内で関数を定義できる• 無名の関数は定義できない• 外部の環境を参照できない• クロージャ使え• 高階関数
本性は関数型言語
おまけと次回予告
Rust 情報源• 公式サイト:http://www.rust-lang.org/• メーリングリスト:https://mail.mozilla.org/listinfo/rust-dev• This Week in Rust:http://c...
次回予告• box• ユーザ定義型• タプル• 構造体、列挙型• オブジェクト思考• 型推論のお話
Rust samurai#01
Upcoming SlideShare
Loading in...5
×

Rust samurai#01

1,043

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,043
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Rust samurai#01

  1. 1. Rust の話http://www.flickr.com/photos/lifeontheedge/246608863
  2. 2. about:me
  3. 3. • 所属• Mozilla Japan マーケティング部• 慶應義塾大学 特別研究教員• @chikoski• プログラミング言語が好き• JavaScript, Ruby, R清水智公 (しみずのりただ)
  4. 4. Rust
  5. 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. 6. Rust の機能的な特徴• 強い型システムと型推論• タスクベースの並行プログラミング• 高階関数、クロージャ• パターンマッチ• 多相性
  7. 7. C言語一門のような文法• {} によるコードブロックの定義• if , while による制御• 関数定義と関数呼び出し• main 関数
  8. 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. 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. 10. 今日の内容
  11. 11. 今日の内容• Hello, World• 変数宣言• 制御構造• 関数定義と呼び出し
  12. 12. version 0.6 のお話です
  13. 13. Hello, World
  14. 14. Hello, Worldfn main(){io::println("Hello, World!");}
  15. 15. 変数
  16. 16. let hi = "hi";let mut count = 0;while count < 10 {io::println(fmt!("count: %?", count));count += 1;}ローカル変数の宣言
  17. 17. let hi = "hi";let mut count = 0;while count < 10 {io::println(fmt!("count: %?", count));count += 1;}単一代入
  18. 18. let hi = "hi";let mut count = 0;while count < 10 {io::println(fmt!("count: %?", count));count += 1;}mutable な変数の宣言
  19. 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. 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. 21. グローバル変数はないa = 10;fn main(){io::println(int::to_str(a));}
  22. 22. グローバル変数はないa = 10;fn main(){io::println(int::to_str(a));}expected item but found `a`
  23. 23. グローバル変数はないlet a = 10;fn main(){io::println(int::to_str(a));}
  24. 24. グローバル変数はないlet a = 10;fn main(){io::println(int::to_str(a));}expected item but found `let`
  25. 25. 定数宣言static a: int = 10;fn main(){io::println(int::to_str(a));}
  26. 26. 定数宣言時の型宣言は省略できないstatic a = 10;fn main(){io::println(int::to_str(a));}
  27. 27. 定数宣言時の型宣言は省略できないstatic a = 10;fn main(){io::println(int::to_str(a));}expected `:` but found `=`
  28. 28. 定数と同名の変数は宣言できないstatic a: int = 10;fn main(){let a = 5;io::println(int::to_str(a));}
  29. 29. 定数と同名の変数は宣言できないstatic a: int = 10;fn main(){let a = 5;io::println(int::to_str(a));}only refutable patterns allowed here
  30. 30. static factor: float = 57.8;let size = factor * 10.0;let size: int = 50;let _size = 50;変数宣言時の型推論
  31. 31. 制御構造
  32. 32. let price = 0;if item == "salad" {price = 3.50;} else if item == "muffin" {price = 2.25;} else {price = 2.00;};条件分岐
  33. 33. let price =if item == "salad" {3.50} else if item == "muffin" {2.25} else {2.00};if 文ではなく if 式
  34. 34. fizzbuzzlet msg = if(n % 15 == 0){"FizzBuzz"}else if(n % 3 == 0){"Fizz"}else if(n % 5 == 0){"Buzz"}else{""};
  35. 35. パターンマッチmatch my_number {0 => io::println("0"),1 | 2 => io::println("1 / 2"),3..10 => io::println("3 - 10"),_ => io::println("?")}
  36. 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. 37. match n {n if n % 15 == 0 => "FizzBuzz",n if n % 5 == 0 => "Buzz",n if n % 3 == 0 => "Fizz",_ => ""}ガード節
  38. 38. 繰り返しlet mut n = 1;while n < 100 {let r = fizzbuzz(n);io::println(fmt!("%? : %s", n, r));n = n + 1;}
  39. 39. loop ⇔ while(true)let mut x = 5;loop {x += x - 3;if x % 5 == 0 { break; }io::println(int::to_str(x));}
  40. 40. 関数定義
  41. 41. 関数呼び出しfn main(){let a = line(1, 0, 1);io::println(int::to_str(a));}
  42. 42. 関数定義fn line(a: int, b: int, x: int) -> int {return a * x + b;}
  43. 43. return は省略できるfn line(a: int, b: int, x: int) -> int {a * x + b}
  44. 44. ;の有無に注意fn line(a: int, b: int, x: int) -> int {a * x + b;}() が返り値になる
  45. 45. いろいろ試してみた• 引数の型は省略できるか?• 返り値の型は省略できるか?• 関数内で関数定義できるか?• 無名の関数は定義できるか?• 関数名の重複は許されるか?
  46. 46. 引数の型は省略できないfn line(a, b, x){a * x + b}
  47. 47. 返り値の型は省略できるがfn line(a: int, b: int, x: int){a * x + b}
  48. 48. 返り値の型は省略できるがfn line(a: int, b: int, x: int){a * x + b}mismatched types: expected `()` but found`int` (expected () but found int)
  49. 49. 関数内関数(JavaScript の場合)function line(a, b, x){funciton add(a, b){return a + b;}return add(a * x, b);}
  50. 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. 51. 外部の変数を参照できないfn line(a: int, b: int, x: int) -> int{fn add(a: int) -> int{return a + b}add(a * x)}
  52. 52. 外部の変数を参照できないfn line(a: int, b: int, x: int) -> int{fn add(a: int) -> int{return a + b}add(a * x)}この b は外側の環境にある
  53. 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. 54. 無名関数(JavaScript の場合)function line(a, b, x){(function(a, b){return a + b;})(a * x, b);}
  55. 55. 無名関数は作成できない(?)fn line(a: int, b: int, x: int) -> int{(fn(a: int, b: int) -> int{return a + b})(a * x, b)}
  56. 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. 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. 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. 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. 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. 61. まとめ
  62. 62. まとめ• 変数• mut をつけないと mutable にならない• グローバル変数なし• 条件分岐:if, match• 繰り返し:while, loop
  63. 63. 関数について• 型はかならず書かなければならない• 関数内で関数を定義できる• 無名の関数は定義できない• 外部の環境を参照できない• クロージャ使え• 高階関数
  64. 64. 本性は関数型言語
  65. 65. おまけと次回予告
  66. 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. 67. 次回予告• box• ユーザ定義型• タプル• 構造体、列挙型• オブジェクト思考• 型推論のお話

×