パーサコンビネータの本質

 Parsecを別の言語に移植できないか、考えてみた。しばらく研究をサボって考えてみた結果、Parsecの本質は>>=と<|>、tryあたりにあると見た。Schemeで書くことを考えると、tryはまぁいい。<|>も比較的簡単に書ける。しかし、>>=は書き難い。>>=をdo記法で書き直す事ができる、という事と、関数は部分適用できる、という事が大きい。これはマクロではうまく隠蔽しきれないかもしれない。
 他言語への移植を考えると、何も言わずに部分適用が使えるというのはHaskellの大きい魅力なんじゃないだろうか。地味な機能だし、部分適用自体は他の言語でも使えるので、あまり目立たないが、部分適用を使って書かれたプログラムをこれがない言語へ移植を行うのは、場合によっては難しい。
 ちょっと考えてみた。要するにカリー化されていればいいわけだ。λ計算の話を思い出してみれば、これはあまり難しくなさそうに思える。というわけで、Schemeで自動的に関数がカリー化されるようなマクロは書けないかと調べてみたら、http://practical-scheme.net/wiliki/wiliki.cgi?p=Scheme%3A%BC%EA%C2%B3%A4%AD%A4%CEcurry%B2%BDというページが見付かった。ほんと、このWiKiは、勉強になりすぎて困る。そして、4年も前の話題である事にちょっとショックを受ける私。
 ショックの話はまぁいいとして、ここで定義されているdefine-curryを使えば、カリー化された関数を自由に定義できる。後は、>>=の構文糖衣としてdo記法のようなマクロが書ければ、かなりParsecに似た形でパーサが書けそう。これがもうひとつ、大きな問題だな…。