ADI

コンマの次はドット。
0.1.4 から

@[0]['1']

の代わりに

@.0.'1'

と書けるが、この並びならドットが無くても字句解析に支障が無い((例えば @a.0.1 だとドットを取ると意味が変わるので省略できない))。

THIS STRNUM STRNUM

間にスペースがあれば括弧が補われて関数呼び出しになる((@ 0 '1'this(0, '1')))が、そうでなければ文法上意味を成さない。エラーにするのはもったいないので、隙間無く書かれていた場合はドットを補うことにした。

$ coco -bpe " @0'1' "
this[0]['1'];

簡易軽便。

ACI

[1, 2, 3]

のコンマが無駄なので

[1 2 3]

と省略できるようになった。

0.2.2 では文法をこねくりまわして実現したが、パーサの負担が大きいのでそれは諦め、より単純に字句解析時にトークンを補うことにした。例えば

.. NUMBER NUMBER ..

を見つけたら

.. NUMBER , NUMBER ..

にする。
Automatic Semicolon Insertion ならぬ Automatic Comma Insertion

backcall

r =
  f (a, b) ->
    g (c) ->
      h ->
        i a, b, c

の代わりに

r = do
  (a, b) <- f
  c <- g
  <- h
  i a, b, c

と書けるようにしてみた。矢印が逆向きなので仮に backcall と呼ぶ。

  • インデントが浅くなって嬉しい(はず)
  • Haskell っぽく書ける(かのように見える)
×
  • インデントが浅くてややこしい(かも)
  • bound function 版を単純に導けない(逆は「≦」に取られている)
    • <~ を当てて =>~> とも書けるようにしたが苦し紛れ感が拭えない

Coco 0.2.0

https://github.com/satyr/coco/tree/0.2.0

CoffeeScript 1.0.0 のリリースに合わせてこちらもバージョンを繰り上げた。
以下は 0.1 → 0.2 で可能になった書き方の一部。

0.1.1
0.2.0
a[0]['@'] a.0.\@
[arguments[1], arguments[2]] @@[1, 2]
[o['+'], o['-']] o<[+ -]>
[x[0], x[1]] = y x[0, 1] = y
{a: x.a, b: x.b} = y x{a, b} = y
@x += z[0]; @y += z[1] [@x, @y] += z
tmp if tmp = f() that if f()
try catch _e then 1 try catch 1
(new class extends C) import k:v C::{k:v}

rest = a.slice(i, ?)

配列 ai 番目以降をコピーしたいとき、

a.slice(i)

と通常は第二引数を省略するが、状況に応じて切り替えたい場合は

a.slice(i, excludeLast ? -1 : x)

のように何か値を渡すことになる。この x を何にすべきか((無論 a.length とはしたくない))。splice痛い目にあっているので調べざるを得ない。

http://jsdo.it/satyr/slice_rest

void 0 1/0 9e9
IE8/Fx3 ng ok ok
Sf5/GC8 ok ok ok

案の定 JScriptSpiderMonkey が非ES的挙動を示す。

7. If end is undefined, let relativeEnd be len; else let relativeEnd be ToInteger(end).

http://sideshowbarker.github.com/es5-spec/#x15.4.4.10

9e9 安定である。

rest = a.splice(i, ?)

配列 ai 番目以降を抜き出したいとき、

a.splice(i, a.length)

だと冗長なので単に省略して

a.splice(i)

と書いていたが、少し前に JScript で失敗することを知って

a.splice(i, 1/0)

((1/0 === Infinity))と書くようになり、でつい今日、今度は JSC が受け付けないことを知った。

http://jsdo.it/satyr/splice_rest

omit 1/0 9e9
IE8 ng ok ok
Sf5 ok ng ok
Fx3/GC8 ok ok ok

ES 的には splice(1)splice(1, 0) 相当らしくカオス。
仕方ないのでこれからは 9e9 ((.length の上限 -1>>>0 より大きければなんでもいい)) を使うことにする。