マイナーAltJS百花繚乱
esehara shigeo
スライドが50枚以上あるので高速でやります。気になるところはあとでスライドで読んでください
!! WARNING !!
開始
Douglas CrockfordJavaScript: The Good Parts
JavaScript::
The World's Most Misunderstood Programming Language
(もっとも誤解された
プログラミング言語)
The World's Most Misunderstood Programming Language Has Become the World's Most Popular Programming Language.
But….
未知との-prototype-遭遇
大規模化
疲労するコーダー
Help…(もうJavaScriptは書きたくない)
CoffeeScriptを汝に捧げよう
救いはTranslator
光main stream
CoffeeScriptJavaScript Translatorの元祖かつ本命
Microsoftの本気
TypeScript
マルチプラットフォームかつ堅牢な型システム
Haxe
人間を超える機械の最適化
JSX
But….
闇sub stream
その前に
お前誰だ
esehara shigeo趣味:言語いじり
PythonistaClojuren←New!!
JavaScript歴 :: jQuey plugin書いたり
こういうのを書いて遊んでます
闇AltJSとは?
個性豊かなダイアの原石のような
Alternative JavaScript(No main)
彼らに光を
GorillaScriptニンニクヤサイSyntaxマシマシ
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.
目的
const fizzbuzz_strings = * "Fizz" * "Buzz" * "FizzBuzz"
let is_fizzbuzz(x) x % 15 == 0
let is_fizz(x) x % 3 == 0
let is_buzz(x) x % 5 == 0
現実(FizzBuzz)
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
for i in 1 til 100 console.log fizzbuzz(i)
Syntaxを見てみよう
Let’s view syntax.
constは文字通り定数です
そしてアスタリスクは配列を作るためです
const fizzbuzz_strings = * "Fizz" * "Buzz" * "FizzBuzz"
解説
letは宣言です。関数を定義する場合は、イコール
を使わず、インデントだけにします。変数の場合
は"=”を使う。ちなみにこの宣言はimmutable(変更不可)なので、mutable(変更可能)にしたいとき
は let mutableという宣言にしないといけない。
let is_fizzbuzz(x) x % 15 == 0
解説
馴染み深い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
解説
Kal非同期時代の申し子
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
FizzBuzzx = 0until x is 99 x += 1 wait for result from fizzbuzz x print result
Syntaxを見てみよう
Let’s view syntax.
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]
解説
このような非同期処理の最中に、処理を
一回ブロックして待ち受ける実装は、Go言語のChannel、Clojureのcore.asyncなど
で採用されていたりする。
ちなみに
Roy関数型JavaScriptのニューカマー
data Option a =
Some a | None
let is_fizz x =
if x % 3 == 0 then
Some "Fizz"
else
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
FizzBuzzlet optionMonad = {
return: \x ->
Some x
bind: \x f -> match x
case (Some a) = f a
case None = None ()
}
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
Syntaxを見てみよう
Let’s view syntax.
RoyではHaskell likeの型を宣言することが出来ます。この場合は、SomeかNoneの型を取るOption型を宣言しています。この場合、値を持つSomeか、あるいは値を持たないNoneのいずれかの型を持つということになります(Scalaとかでも見ますね)
data Option a = Some a | None
解説
型を宣言したら、オブジェクトリテラルで使用することができます
let optionMonad = { return: \x -> Some x bind: \x f -> match x case (Some a) = f a case None = None ()}
解説
あとは、<-という記法で結果を束縛したり、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
解説
Royの作者は、アメリカのJSCONF 2012のときに、Monad SyntaxはCallback地獄に対してすっきりすると述べている(実
はRoyのMonad Syntaxはコールバック
に変換される。例としてAjax Monad(!!)のアプローチなどを紹介している)
ちなみに
おまけ
ClojureScriptKing of 闇のAltJS
ClojureScript
ClojureScriptいいところ
LISP
ClojureScriptわるいところ
LISP
元々、JVM言語であるClojureを元に実装
しており、Clojure公式のGitHub Groupでもポートされているので、Clojureが死なな
ければたぶんClojureScriptも死なない
冗談はおいておくとして
さらに言えば、Clojure + ClojureScriptで使えるライブラリもそこそこあったりするの
で、他の言語のエコシステムと比較しても
面白い
冗談はおいておくとして
ただ自分の場合、まだ上手い感じで書け
ないのでJavaScriptがでかくなる(ただし
ロジックは書きやすい)
冗談はおいておくとして
以上
Happy Hacking JavaScript Life!!
良きJavaScript lifeを!