Thu Aug 7 22:30:38 JST 2014

Coffee Script のメソッドチェーンが中置演算子っぽい

javascriptの

obj.method(arg)

をcoffeeでは

obj.method arg

と書くが、

obj .method arg

のようなスペースの挟み方は許されており、 中置演算子のように見える。 この演算子は常に右結合である。

{log} = console

Object::pair = (x) -> [@valueOf(), x]

log 0 .pair 1 .pair 2 .pair 3
# => [ 0, [ 1, [ 2, 3 ] ] ]
log (0 .pair 1) .pair 2 .pair 3
# => [ [ 0, 1 ], [ 2, 3 ] ]
log ((0 .pair 1) .pair 2) .pair 3
# => [ [ [ 0, 1 ], 2 ], 3 ]

本来のメソッドチェーンは左結合であるべき

Object.prototype.pair = function(x){ return [this.valueOf(), x] };
console.log(0 .pair(1) .pair(2) .pair(3))
// => [ [ [ 0, 1 ], 2 ], 3 ]

これを coffee で再現するには、 結局 javascript と全く同様に 0.pair(1).pair(2).pair(3) と、 括弧を補う必要があったけれど、 Coffee Script ver. 1.7.0 からは、

x = 0 .pair 1
      .pair 2
      .pair 3
log x
# => [ [ [ 0, 1 ], 2 ], 3 ]

と改行によって左結合にできるようになった。

それはそうと、

Number::cons = (ls) -> [@valueOf()] .concat ls
log 1 .cons [2 .. 10] .concat ( 10*i for i in [2..10])
# => [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 ]

かっこいい。