PlaggerやPRaggerを使って思った事 - Meguuの日記について
※あー私がこうあるべきじゃないかなって思ってるってだけで、全体として今後Praggerをどうするべきか、っていう話とは別ですので。念のため。
その時違和感が…。どうしてこんなシーケンシャルな操作しかないの?みんな気持ち悪くないんだろうか。制御構文が一つも出てこないじゃないかと。
まず、Pragger(あるいはPlaggerも含めて)の設計思想から言うと、別に気持ち悪くありません。Praggerは、汎用のプログラミング言語ではなく、Unixシェルのパイプに相当する操作のみを実装したプログラミング言語です。関数呼び出しだけしかないプログラミング言語と一緒だと思います(f(g(h(data)))としか書けないプログラミング言語。代入もループも関数定義もありません)。なんでそういう設計になっているかというと、そういう簡易な言語が欲しかったから、だと思います。RSSを取ってきて、フィルタリングするだけの作業に、条件分岐やループはいらない、と。常にチューリング完全なプログラミング言語だけで作業しなければならないわけではありませんから。あるいは、Pragger(はともかくとして)やPlaggerがここまで面白がられるのは、その簡素な世界で意外といろいろなことができるからじゃないかとも思います。
もちろん、「それは不便じゃないか」という意見はあると思いますし、プラグインを書いてくださるのはとてもとてもとてもありがたいことですし、そのうち取り込ませていただくかもしれませんが、「気持ち悪い」とは思っていないということです。
実は、RejectKaigiでは「Pragger is LL」と題して(これはもちろん、昨年LLRingでの竹迫さんのLT「Plagger is LL」のパクリですが)、「Praggerをチューリング完全にしました。チューリング完全じゃないPlaggerがLLだなんて、とんだ思い上がりだ!」という話をしようかと思ったのですが、よく考えたらそれは違うよなぁ、と*1。先に書いたように、Praggerは「関数呼び出ししかないプログラミング言語」です。プラグインというのは、組み込みの関数に相当します。組み込み関数を充実させることはできますが「関数呼び出ししかない言語」に「条件分岐やループ」を入れるには、言語自体の拡張が必要になります。VisualBasicのIIF関数とCの三項演算子*2の違いです。そうすると、Praggerがチューリング完全になったとしても、それはすでにPlaggerのパクリではなくなってしまうわけです。
あるいは、増井さんにいただいたコメントとも関連しますが、YAMLには現在の計算モデル以上のものを記述する能力はないでしょう。それこそ
IF: cond: LT: lhs: VAR: name: x rhs: INT: value: 0 then: ASGN: var: x expr: MULT: - VAR: name: x - INT: value: -1
なんて書きたくありませんし、読みたくもありません。
if x < 0 x = -x end
で十分です。