浜松Ruby会議01 http://regional.rubykaigi.org/hamamatsu01/ の発表資料です。
http://mzp.hatenablog.com/entry/2015/03/29/213909 もあわせてご覧ください。
mzpRubyistͷͨΊͷܕೖ
View Slide
ࣗݾհ• Twitter/Github: mzp• ໊ݹ͔Βདྷ·ͨ͠• ͓ࣄͰRailsΛॻ͍͍ͯ·͢• OCamlͱ͔ͷܕͷڧ͍ݴޠ͕͖Ͱ͢
એΫϥυٻཧαʔϏεMisocaʮࣄۀऀؒͷऔҾΛ࠷దԽ͢Δʯ
໊ݹRubyձٞ02
Rubyͱͷग़ձ͍• େֶ1ͷͱ͖ʹ͍͡Ίͨɻ• ͏10ͨͬͯΔ…• ઌഐʹPerlΛקΊΒΕͨͷ͕͖͔͚ͬ↓͜ΕಡΜͩ
LLશظ• ࣌LL(Lightweight Language)ͱͯ͠ɺ·ͱΊͯޠΒΕ͍ͯͨɻ• Pݴޠ(Perl, Python, PHP, Ruby)Έ͍ͨͳݴ༿͋ͬͨhttp://magazine.rubyist.net/?0016-LLRingReport※ݸਓͷײͰ͢
੩తܕ͖ݴޠͱͷൺֱ• Java/C++ͱ͍ͬͨ੩తܕ͖ݴޠͱൺֱ͞Εͯͨ• Ұ෦ͷਓdisͬͯͨ• ࣄͰJavaɺझຯͰLLɺΈ͍ͨͳਓ͕ଟ͔ͬͨ※ݸਓͷײͰ͢
ͦΕ͔Β10…• LLͰࣄ͢Δͷ͍͠Ͱͳ͘ͳͬͨ• Scala, Swift, F#, Go, TypeScript ͳͲ৽͍͠੩తܕ͖ݴޠొ͍ͯ͠Δ• ੩తܕ͖ݴޠ͕ͳͥ໓ͼͳ͔ͬͨͷ͔ɻ• ࣌ͷඇ͕ؒҧͬͯͨ?• μϝͳ෦͕վળ͞Εͨ?
࣌ͷ੩తܕ͖ݴޠ
ରͱͳͬͨݴޠ• C++03: C++ 0x(͘͠11)·ͩϦϦʔε͞Ε͍ͯ·ͤΜ• Java1.4: Java5͕ϦϦʔε͞ΕΔલɺ͘͠ϦϦʔεޙͰ͢
↓1िؒલͷ༑ਓͷπΠʔτ
ඇ͞Εͨ1. ίϯύΠϧʹ͕͔͔࣌ؒΔ2. จ๏͕3. ܕ͕ځ۶4. ܕͷ͍ͤͰهड़ྔ͕૿͑Δ
ίϯύΠϧʹ͕͔͔࣌ؒΔ• ίϯύΠϧܕݴޠ: ίϯύΠϧ͕ऴΘΔ·Ͱಈ࡞Λ֬ೝͰ͖ͳ͍ɻ• ΠϯλϓϦλܕݴޠ: ͙͢ʹ࣮ߦͯ͠ಈ࡞Λ֬ೝͰ͖Δɻ
จ๏͕class Main {public static void main(String args[]) {System.out.println("Hello, world!!");}}puts “Hello, world!!”JavaRuby
ܕ͕ځ۶(ͦͷ··Ͱॻ͚ͳ͍ɺ͕ඞཁ)x = [ 1, 2, “fizz”, [] ]੩తܕ͖ݴޠRuby
ܕͷ͍ͤͰهड़ྔ͕૿͑ΔArrayList xs = new ArrayList();xs.add((Object)new Integer(1));xs.add((Object)new Integer(2));xs.add((Object)new Integer(3));[1, 2, 3]JavaRuby
͜͜·Ͱͷ·ͱΊ• ੩తܕ͖ݴޠॏްͰ͋Δ• هड़ྔଟ͍͠ɺಈ͔͢·Ͱͷେม→ ͍ܰݴޠ(Lightweight Language)ͷ΄͏͕ศར!!
࠷ۙͷ੩తܕ͖ݴޠ
࠷ۙొͨ͠੩తܕ͖ݴޠ• Scala: JVM্Ͱಈ࡞͢Δݴޠɻ better Javaͱ͍ͯͬͯ͠Δͱ͜Ζଟ͍ɻ• F#: .NET্Ͱಈ࡞͢ΔؔܕݴޠɻOCamlʹେ͖ͳӨڹΛड͚͍ͯΔɻ• OCaml/Haskell: ؔܕݴޠɻ࠷ۙɺొͨ͠Θ͚Ͱͳ͍͕ɺʹͳΓ͕ͪɻ• ͦͷଞ: AltJSɺSwiftɺ….
Ͳ͏มΘ͔ͬͨ1. ίϯύΠϧʹ͕͔͔࣌ؒΔ2. จ๏͕3. ܕ͕ځ۶4. ܕͷ͍ͤͰهड़ྔ͕૿͑Δ
ίϯύΠϧʹ͕͔͔࣌ؒΔ• ʮίϯύΠϧ͕վળ͠·ͨ͠!!ʯͬͯݴ͓͏ͱͨ͠ΒɺScalaܹͩͬͨ…• ͨͿΜΈΜͳզຫͯ͠Δ
http://tototoshi.hatenablog.com/entry/20130614/1371221918
Q. Scalaͳ͍ͥͷ
จ๏͕ϦονͳϦςϥϧܕਪ͕ಋೖ͞Εɺ͍ͩͿ͘ͳͬͨlet () = print_endline "Hello, world!!"OCamlobject Main extends App {println("Hello, world")}Scala
ܕ͕ځ۶ɾܕͷ͍ͤͰهड़ྔ͕૿͑Δ• ࣌ͱࠓͰܕͷҐஔ͚͕ҟͳΔɻ• ࣌ͷܕ: ऑ͍ܕ͚ɻܕ҆શ͕อূ͞Εͳ͍ɻ• ࠓͷܕ: ڧ͍ܕ͚ɻܕ҆શ͕อূ͞ΕΔɻ• ܕ҆શ: ͜͜Ͱʮ࣮ߦ࣌ʹܕΤϥʔ͕ى͖ͳ͍ʯ͘Β͍ͷҙຯɻ
ऑ͍ܕ͚• ܕνΣοΫʹ௨ͬͯɺʮܕ҆શʯ͕อূ͞Εͳ͍• Java/C++ʹΩϟετ͕͋ΔͷͰɺίϯύΠϧʹޭͯ͠ܕʹΑΔΤϥʔ͕ى͖Δ͔͠Εͳ͍Foo*p = (Foo*)0x42;p->f(); // ← ࢮ͵(ͨͿΜ)ɻC++
ڧ͍ܕ͚• ܕνΣοΫʹ௨Εɺʮܕ҆શʯ͕อূ͞ΕΔ• ΩϟετͷܕΛڧ੍తʹมߋ͢Δํ๏ͳ͍• ୯७ʹΩϟετΛͳ͚ͨͩͩ͘͠ͱɺ੍͕ݫ͘͠ͳΔ͚ͩͰخ͘͠ͳ͍• → ܕʹؔ͢Δڧྗͳػೳ͕༻ҙ͞ΕΔ͜ͱ͕ଟ͍
࠷ۙͷܕγεςϜ
ܕਪ• ܕΛ(͋Δఔ)ॻ͔ͳͯ͘OK• Ͳ͜·Ͱਪͯ͘͠ΕΔ͔ݴޠʹΑͬͯҟͳΔ// xsͷܕstring listͱਪ͞ΕΔlet xs = ["foo"; "bar"; "baz"]OCaml
Scalaͷܕਪ• ϝιουͷҾɺฦΓਪ͠ͳ͍• มఆٛͷܕਪ͢Δ// ϝιουͷҾͱฦΓͷܕॻ͘(লུͰ͖ͳ͍)def f(x : Int, y : Int) : Int = {// มఆٛͷܕলུͰ͖Δval z = x + yz}Scala
OCamlͷܕਪ• ؔͷҾɺฦΓਪ͢Δ(* ϝιουͷҾͱฦΓͷܕΛলུͰ͖Δ *)let f x y =(* มఆٛͷܕলུͰ͖Δ *)let z = x + y inzOCaml
ܕ͕͍ܰ• ܕΛ࡞Δํ๏͕ଟ͍• ϑΝΠϧΛ࡞ͬͯɺΫϥεΛఆٛͯ͠…ɺΈ͍ͨͳ͜ͱΛ͠ͳͯ͘৽͍͠ܕΛ࡞ΕΔ• Ұ෦ͷਓʮܕ͕͍ܰʯͱදݱ͢Δ
ੵܕ• 2ͭҎ্ͷܕΛʹͨ͠ܕdef getPoint() : (Int, Int) = {(1, 2)}Scaladef get_point[1, 2] # x࠲ඪͱy࠲ඪendRuby(Int, Int) Ͱɺ2ͭͷIntͷͷΛද͢ܕΛ࡞ΕΔ
ܕ• ͓ޓ͍ʹ۠ผ͞ΕΔܕΛఆٛ͢Δ• C/Javaͷenumʹࣅ͍ͯΔ͕ύϥϝʔλΛ࣋ͯΔͷͰΑΓॊೈ(* τϥϯϓͷΧʔυΛఆٛ͢Δ *)type card = Number of int | J | Q | KOCaml
ύλʔϯϚον• ܕʹରͯ͠ͷذɺઐ༻ͷߏจ͕͋Δ• ཏ͍ͯ͠Δ͜ͱΛίϯύΠϥ͕อূ͢Δ(* ΧʔυͷΛऔಘ͢Δؔ *)let get_number x =match x with| Numebr n -> n| J -> 11| Q -> 12| K -> 13
ͬͱ͍͢͝ܕ• Ϩίʔυܕ: ੵܕͷ1छɻ0൪ɺ1൪ͱ͍͏ͷ͔ΘΓʹɺ໊લΛ༩͑ΕΔɻ• ߏత෦ܕ: fͱ͍͏ϝιουͱgͱ͍͏ϝιουΛ͍࣋ͬͯΔܕɺͱ͍͏ͷ͕දݱͰ͖Δɻ(Ұ෦Ͱ੩తduck typeͱݺΕΔ)• ܕ͖printf: printf "%s" string͔͠ड͚ͱΒͳ͍ɺͱ͍͏͜ͱ͕Ͱ͖Δ
ܕͰՄೳʹͳΔ͜ͱ• ܕͷදݱྗ্͕͍ͬͯΔͷͰઃܭҙਤΛදݱͰ͖Δ• ίϯύΠϧ͕ҰछͷςετʹͳΔ• ྫ: ը໘ʹग़ྗ͢ΔจࣈྻඞͣαχλΠζ͞Εͯͳ͚ΕͳΒ͍(ϑΝϯτϜλΠϓ; ༓ྶܕ)• υΩϡϝϯτͷҰछʹͳΔ• ݕࡧͰ͖Δ: Hoogle, OCamlScope
Rubyͬͯܕ͔ͭͳ͍ͷ?• RubyʹܕΛ͚ͭΔ͜ͱΛతͱͨ͠ϓϩδΣΫτ͕͋Δ• ྫ: Diamondback Ruby http://www.cs.umd.edu/projects/PL/druby/class String##% "+" : (String) -> Stringdef +(p0); end##% insert : (Fixnum, String) -> Stringdef insert(p0, p1); end...end
·ͱΊ: Ͳ͕͍͍ͬͪͷ?• έʔεɾόΠɾέʔε• ܕ੍: Ͱ͖Δ͜ͱ͕ಘΔ͕ɺޡΓݮΒ͢• ҆શੑΛॏࢹ͢ΔͳΒܕΛ͏͖ͩ͠ɺߴʹ࡞Γ͍ͨͳΒܕΛΘͳ͍͍ͯ͘• ܕγεςϜʹ͍Ζ͍Ζ͋ΔͷͰɺঢ়گʹซͤͯબ͠·͠ΐ͏