Your SlideShare is downloading. ×
Callback DSL on Haxe
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Callback DSL on Haxe

1,981
views

Published on

Frontrend FukuokaでLTした資料です

Frontrend FukuokaでLTした資料です

Published in: Technology

0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,981
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
4
Comments
0
Likes
7
Embeds 0
No embeds

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. Callback DSL on Haxe by Technical Rockstars CTO @nobkz
  • 2. 自己紹介 Technical Rockstars CTO tw : @nobkz Haxe/JS/C#/Java/Objective-C++ 好きな言語:Lisp(Common Lisp, Gauche)/Haskell/ OCaml/Prolog 福岡Haxe勉強会主催
  • 3. Haxe?
  • 4. Haxe いろんな言語にコンパイルできる (to Flash, C++, C#, JS, PHP, Java, NekoVM) 強力な型システム(型推論など) 強力なマクロ
  • 5. “これから HaxeでDSL作った話しをします” -@nobkz
  • 6. なぜHaxeでDSLを 実装したか?
  • 7. “ある日のことでした” -@nobkz
  • 8. “それはHaxeでnodeとか seleniumのテストを書いていました。” –@nobkz
  • 9. そいつは、いつのまにか ぶくぶくと大きくなってました。 @nobkz
  • 10. コールバック地獄例
  • 11. 僕はコールバック地獄に 悩まされていました
  • 12. ある日のこと…
  • 13. 僕は最高の3大エンタメ (まどまぎ、ボルテ、Scheme)の一つ、 Schemeを楽しんでいた。
  • 14. “ん?コールバックて CPSスタイルだよね….” –@nobkz
  • 15. CPSスタイル(Scheme)
  • 16. “そういえばHaskellに継続モナド ってあったよなぁ。” –@nobkz
  • 17. http://www.sampou.org/haskell/a-a-mon contmonad.html
  • 18. そして僕は気づいた
  • 19. “そうだ! 継続モナドを同様の仕組みで DSLを創れば良いんだ!” –@nobkz
  • 20. 継続モナドの利用 コールバック地獄 -> CPSスタイルに似ている? コールバックを継続モナドで表現する それを、合成すれば良いんじゃないか?
  • 21. 方針 1 . とりあえず、モナドの結合ができるようにする 2. do記法をつくる 3. コールバックDSLをつくる
  • 22. そしていろいろあって
  • 23. 実装しました。 (この点については 次回のHaxe勉強会で話します)
  • 24. 結局できたもの
  • 25. Before
  • 26. Before
  • 27. After
  • 28. After
  • 29. なんということでしょう!
  • 30. 結果 簡単になった! コールバックのネストが無くなった。 構文のノイズが無くなって読みやすい! ただ、ボイラープレートが残っている感。
  • 31. けどちょっとだけ、 実装の仕組みについて (時間が無ければ飛します)
  • 32. Monad?
  • 33. Monad 言語内DSLを構築するための仕組み モジュールの組み合せ方 背景に数学的な理論がある(圏論)
  • 34. Optionモナド作成
  • 35. Option(Maybe)型について Option(HaskellではMaybe)型をつくる data Maybe a = Just a | Nothing Haxeではenumで実現
  • 36. HaxeのEnumについて enumはCの列挙体とはちょっとちがう コンストラクタがパラメータを持つことができる
  • 37. enumの例 enum MyNumber{ Zero; Plus(i:Int); Minus(i:Int); } ! var x : MyNumber = Zero; var y : MyNumber = Plus(10); var z : MyNumber = Minus(10);
  • 38. EnumでOptionの実装 型パラメータとEnumでOptionを作った。 enum OptionDef<T>{ None; // Nothing of Haskell Some(i:T); // Just of Haskell }
  • 39. returnとbind モナドで必要に関数は2つ Mが対象のデータ型だとする return :: A -> M A >>= :: M A -> (A -> M B) -> M B これらの関数がモナド則を満すように実装する
  • 40. Haxeでのreturnとbind クラスメソッドとして実装する returnだと、返り値のreturnと混合するので、mPack とした。 >>=はmBindとした。
  • 41. Optionのreturnとbindの型定義 Option型のクラスをつくり、クラスメソッドとして 実装する Option.mPack<A> : A -> OptionDef<A> Option.mBind<A,B> : OptionDef<A> -> ( A -> OptionDef<B> ) -> OptionDef<B>
  • 42. 実装 class Option{ public static function mPack <A>(a : A) : Option<A> return Some(a); ! public static function mBind <A,B>(m : OptionDef<A>, f : A -> OptionDef<B>) : OptionDef<B> return switch(m){ case Some(a) : f(a); case None : None; }; }
  • 43. returnとbindを組み合わせ モナドの計算はbind(>>=)とreturnで組織する Haskell の例: return 10 >>= (x -> return x >>= (y -> return x >>= (z -> return (z + x + y))))
  • 44. Haxeでのモナドの計算 Haxeのある機能をつかわないとやりづらい Option.mBind(Option.mPack(10),function(x) return Option.mBind(Option.mPack(x), function(y) return Option.mBind(Option.mPack(y),function(z) return Option.mPack(x+y+z)))); しかるある機能を使うと途端に楽になる
  • 45. using! usingを使うと第一引数が、なんと、メソッドを呼 び出すオブジェクトみたいに! using Option; ! 10.mPack().mBind(function(x) return x.mPack().mBind(function(y) return y.mPack().mBind(function(z) return (x + y + z).mPack())));
  • 46. HaxeでOptionモナドを実装した とりあえず、Haxeでも十分にモナドの計算ができ る! 次に継続モナドだが、次回Haxe勉強会で
  • 47. Haxeのdo記法の実装
  • 48. 前提知識:Haxeのマクロ Haxeのマクロ(黒魔法とも呼ばれる)は新しい構文を 定義することができる マクロでdo記法をつくる
  • 49. 構文木はEnum Haxeの構文木はEnumで表現されている。 1 + 1の構文木は次の様にHaxeで表わせる
  • 50. 1 + 1の構文木 { expr : EBinop(OpAdd, { expr : EConst(CInt(1)), pos : #pos(Sample.hx:10: characters 6-7) }, { expr : EConst(CInt(2)), pos : #pos(Sample.hx:10: characters 10-11) }), pos : #pos(example/Sample.hx:28: characters 6-11) }
  • 51. 構文木を書き代える Haxeのマクロは構文木を書き代えることができる 構文木を書き代えることによって、別の表現を与 える事ができる
  • 52. 例 : 1 + 1を引き算にする macro public static function toSub(e){ return switch (e.expr) { case EBinop(OpAdd, a, b): macro $a - $b; case _: e; } } ! ! toSub(1 + 1); // => 0
  • 53. マクロでdo記法を実装 詳しくは次回Haxe勉強会で説明します
  • 54. これから先は次回Haxe勉強会にて!
  • 55. Haxe勉強会やんお! 2月のどっかやんお! 福岡でやんお! 詳細は、@nobkzで流れまう!
  • 56. Callback DSL & Monad Frameworks のこれから
  • 57. これから liftのなどのモナド関数に実装 読みやすいDSLを目指す LinqみたいなDSLの実装 公開するお!
  • 58. ご清聴ありがとうございました! @nobkz