CoffeScriptをさらに書きやすくしたLiveScript
LiveScriptは、CoffeScriptをもっとよくしたCocoのfork。
LiveScriptで書かれたpreludelsというライブラリがあるので関数型っぽい関数が使える。(foldやらscanやら)
Function
カリー化
f = (x, y) --> x * y f(2)(2) # 4 f = (x) -> (y) -> x * y f(2)(2) # 4
合成
f = (x) -> x + 1 g = (y) -> y + 2 (f << g)(1) # 4 (f . g)(1) # 4 (f >> g)(1) # 4
List
パイプ
[1 to 10] |> map (i) -> i * i |> reverse |> head # 100
リスト内包
[ x + y for x to 3 when x % 2 is 0 for y to 3 ] # [0,1,2,3,2,3,4,5]
etc..
zip [1 to 3] [\A to \C] # [[1,"A"],[2,"B"],[3,"C"]] scan (+), 0, [1 to 3] # [0,1,3,6] fold (+), 0, [1 to 5] # 15 take-while odd, [1 3 5 6] # [1 3 5]
定義
obj = * name: 'tessa' age: 23 # {"name":"tessa","age":23} <[ a b c ]> # ["a", "b", "c"]
未実装
f = -> ... f() # throw Error('unimplemented');
パターンマッチ
f = -> switch it | 0 false null undefined => "ng" | "foo" => "bar" | _ => "ok" f(0) # ng f(1) # ok
正規表現
/^[a-z]*/ == "abc123" # [abc]
再帰
sum
sum = (list, acum = 0) -> | !list.length => acum | _ => [head, ...tail] = list sum(tail, acum + head) sum([1,2,3]) # 6
qsort
qsort = (list) -> | !list => [] | list.length is 1 => [head list] | _ => h = head list {l, c, r} = group-by ((i) -> | h > i => "l" | h == i => "c" | h < i => "r"), list qsort(l) ++ c ++ qsort(r) qsort([3,1,2,4,5,-1,-1,2]) # [-1,-1,1,2,2,3,4,5]
だいぶ短く書けるようだ。
しかしheadとtailが書きづらい。
まとめ
これがJSだと思うとだいぶいいと思う。
coffescriptよりもさらに短く書けて、cocoのforkなのでより最適化されている。というかパターンマッチが書きやすい!
関数型やってる人にはいいかもしれない。(・・`)