Successfully reported this slideshow.

マイナーAlt JS百花繚乱

6,994 views

Published on

マイナーAlt JS百花繚乱

  1. 1. マイナーAltJS百花繚乱 esehara shigeo
  2. 2. !! WARNING !! スライドが50枚以上あるので 高速でやります。気になるところは あとでスライドで読んでください
  3. 3. 開始
  4. 4. JavaScript:: The World's Most Misunderstood Programming Language (もっとも誤解された プログラミング言語) Douglas Crockford JavaScript: The Good Parts
  5. 5. The World's Most Misunderstood Programming Language Has Become the World's Most Popular Programming Language.
  6. 6. But….
  7. 7. 未知との -prototype- 遭遇
  8. 8. 大規 模化
  9. 9. 疲労する コーダー
  10. 10. Help… (もうJavaScriptは書きたくない)
  11. 11. CoffeeScript を汝に捧げよう
  12. 12. 救いは Translator
  13. 13. 光 main stream
  14. 14. CoffeeScript JavaScript Translatorの元祖かつ本命
  15. 15. TypeScript Microsoftの本気
  16. 16. Haxe マルチプラットフォームかつ堅牢な型システム
  17. 17. JSX 人間を超える機械の最適化
  18. 18. But….
  19. 19. 闇 sub stream
  20. 20. その前に
  21. 21. お前 誰だ
  22. 22. esehara shigeo 趣味:言語いじり Pythonista Clojuren←New!! JavaScript歴 :: jQuey plugin書いたり
  23. 23. こういうのを書いて遊んでます
  24. 24. 闇AltJS とは?
  25. 25. 個性豊かな ダイアの原石のような Alternative JavaScript (No main)
  26. 26. 彼らに 光を
  27. 27. GorillaScript ニンニクヤサイSyntaxマシマシ
  28. 28. 目的 Thus, one of GorillaScript's main goals is to optimize human thought by relieving as much stress and ceremony of coding as possible while simultaneously enabling the writing of beautiful code.
  29. 29. 現実(FizzBuzz) const fizzbuzz_strings = * "Fizz" * "Buzz" * "FizzBuzz" let is_fizz(x) x % 3 == 0 let fizzbuzz (x) switch case is_fizzbuzz(x) fizzbuzz_strings[2] case is_fizz(x) fizzbuzz_strings[0] case is_buzz(x) fizzbuzz_strings[1] default x let is_buzz(x) x % 5 == 0 for i in 1 til 100 console.log fizzbuzz(i) let is_fizzbuzz(x) x % 15 == 0
  30. 30. Syntaxを見てみよう Let’s view syntax.
  31. 31. 解説 constは文字通り定数です そしてアスタリスクは配列を作るためです const fizzbuzz_strings = * "Fizz" * "Buzz" * "FizzBuzz"
  32. 32. 解説 letは宣言です。関数を定義する場合は、イコール を使わず、インデントだけにします。変数の場合 は"=”を使う。ちなみにこの宣言はimmutable(変 更不可)なので、mutable(変更可能)にしたいとき は let mutableという宣言にしないといけない。 let is_fizzbuzz(x) x % 15 == 0
  33. 33. 解説 馴染み深いswitch文ですが、最初のswitchに変数を指定しな いことで、簡易版if-elseとしても使えます。 let fizzbuzz (x) switch case is_fizzbuzz(x) fizzbuzz_strings[2] case is_fizz(x) fizzbuzz_strings[0] case is_buzz(x) fizzbuzz_strings[1] default x
  34. 34. Kal 非同期時代の申し子
  35. 35. FizzBuzz task is_buzz (x) return x mod 5 == 0 task is_fizz (x) wait for buzz from is_buzz(x) fizz = x mod 3 == 0 return [fizz, buzz] task fizzbuzz (x) wait for fizzbuzz from is_fizz(x) when fizzbuzz[0] and fizzbuzz[1] return "FizzBuzz" when fizzbuzz[0] return "Fizz" when fizzbuzz[1] return "Buzz" otherwise return x x=0 until x is 99 x += 1 wait for result from fizzbuzz x print result
  36. 36. Syntaxを見てみよう Let’s view syntax.
  37. 37. 解説 taskとは、非同期処理が発生するfunction専門の宣言。 wait for foo from bar は、処理が返ってくるまで待機せよという こと。 task is_buzz (x) return x mod 5 == 0 task is_fizz (x) wait for buzz from is_buzz(x) fizz = x mod 3 == 0 return [fizz, buzz]
  38. 38. ちなみに このような非同期処理の最中に、処理を 一回ブロックして待ち受ける実装は、Go言 語のChannel、Clojureのcore.asyncなど で採用されていたりする。
  39. 39. Roy 関数型JavaScriptのニューカマー
  40. 40. FizzBuzz data Option a = let optionMonad = { Some a | None return: x -> Some x let is_fizz x = bind: x f -> match x if x % 3 == 0 then case (Some a) = f a Some "Fizz" else case None = None () } None () let is_buzz x m = if x % 5 == 0 then match m case (Some a) = Some (a ++ "Buzz") case None = Some "Buzz" else m let fizzbuzz x y = if x > y then console.log("") else let fizz = is_fizz x let result = (do optionMonad buzz <- is_buzz x fizz return buzz ) match result case (Some a) = console.log a case None = console.log x fizzbuzz (x + 1) y fizzbuzz 1 100
  41. 41. Syntaxを見てみよう Let’s view syntax.
  42. 42. 解説 RoyではHaskell likeの型を宣言することが出来ま す。この場合は、SomeかNoneの型を取るOption 型を宣言しています。この場合、値を持つSome か、あるいは値を持たないNoneのいずれかの型 を持つということになります(Scalaとかでも見ます ね) data Option a = Some a | None
  43. 43. 解説 型を宣言したら、オブジェクトリテラルで使用するこ とができます let optionMonad = { return: x -> Some x bind: x f -> match x case (Some a) = f a case None = None () }
  44. 44. 解説 あとは、<-という記法で結果を束縛したり、case文で型による分 岐をしたりすることができます let fizzbuzz x y = if x > y then console.log("") else let fizz = is_fizz x let result = (do optionMonad buzz <- is_buzz x fizz return buzz ) match result case (Some a) = console.log a case None = console.log x fizzbuzz (x + 1) y
  45. 45. ちなみに Royの作者は、アメリカのJSCONF 2012 のときに、Monad SyntaxはCallback地 獄に対してすっきりすると述べている(実 はRoyのMonad Syntaxはコールバック に変換される。例としてAjax Monad(!!)の アプローチなどを紹介している)
  46. 46. おまけ
  47. 47. ClojureScript King of 闇のAltJS
  48. 48. ClojureScript
  49. 49. ClojureScript いいところ LISP
  50. 50. ClojureScript わるいところ LISP
  51. 51. 冗談はおいておくとして 元々、JVM言語であるClojureを元に実装 しており、Clojure公式のGitHub Groupで もポートされているので、Clojureが死なな ければたぶんClojureScriptも死なない
  52. 52. 冗談はおいておくとして さらに言えば、Clojure + ClojureScriptで 使えるライブラリもそこそこあったりするの で、他の言語のエコシステムと比較しても 面白い
  53. 53. 冗談はおいておくとして ただ自分の場合、まだ上手い感じで書け ないのでJavaScriptがでかくなる(ただし ロジックは書きやすい)
  54. 54. 以上
  55. 55. 良きJavaScript lifeを! Happy Hacking JavaScript Life!!

×