webネタ

Webエンジニアが業務に関係することをメモしていく

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なのでより最適化されている。というかパターンマッチが書きやすい!

関数型やってる人にはいいかもしれない。(・・`)