ジェネレータを使ってパーサを綺麗に書けるようにした

ライブラリ側の実装は ES2015 の構文を使わずに ES5 互換のままできることに気がついたので, ちゃっちゃーとやりました.

github.com

今までは,

var lq = require("loquat");
// 愚直に >>= (bind) と >> (then) を使う
// do 構文なんてなかった
var parser = lq.char('"')
    .then(lq.noneOf('"').manyChar())
    .bind(str => lq.char('"')
        .then(lq.pure(str))
    );

とか,

var lq = require("loquat");
// Applicative の *> (right) と <* (left) を使って少し簡潔に
var parser = lq.char('"')
    .right(lq.noneOf('"').manyChar())
    .left(lq.char('"'));

などと書いていたところを,

var lq = require("loquat");
var parser = lq.gen(function * () {
    // パーサを yield で投げるとパース結果が返る
    yield lq.char('"');
    var str = yield lq.noneOf('"').manyChar();
    yield lq.char('"');
    // return で通常の (パーサでない) 値を結果として返す
    return str;
});

のように, かなり直感的に (Parsec で do 構文を使った時のように) 書けるようになりましたとさ. めでたし.