最新

おおいわのこめんと (2009-10)


2009-10-01

[Comp] (camlspotter) CamlP4 をちょっと改造してこんなものを作ったよ

ええと、なんか流れが refer 強要したみたいになっちゃって恐縮してるんですが (^^; なんかこっちも連休で昔のコードいじって Regexp/OCaml 復活させたりしてたんで (参照)、なんかタイミングが妙に一致してるなー、と思ったので :-) すが、単にどっちも OCaml Tokyo があったからという気がしてきました :-)

ちなみに、2002年ころに Regexp/OCaml を作った時の動機はいくつかあって、 自分で HTTP のクライアントを OCaml で書いていた時に、

  • 妙な if 文の羅列が嫌だった
  • パターンの "\\" がやっぱり読みづらかった。これは今でも主に elisp を書いているとイライラします :-)
  • そのあとに string_of_int が延々と続くのがやっぱり気持ち悪かった
  • (..)? みたいなマッチの取り扱いが気持ち悪かった

という辺りです。

というわけで、実は Regexp/OCaml でも \ を2重にする必要はありません。 なんでこんなことができているかというと、Camlp4 の文字列は unquote される前の状態で 拡張に渡されていて、OCaml 側で \ の解釈がされていたからなんですね。 なので、p4 マクロにも解釈を変更するチャンスがあって、 これ幸い、と lexer をいじらずに実現しているわけです。 で、3.10 以降の現状で困っているのは、この仕様は変わっていないにも関わらず、 Camlp4 が警告だけ lexer で出す仕様になってしまった、ということだったりします。

(Caml コードだらけの続きを読む) ...

以上、宣伝でした(笑)。

あと、元記事の「もし、Perl のこんな機能というか糞記法が OCaml でも書ければ糞でいいのに」 ですが、既に別のエントリに書かれてましたが、やっぱり文字列置換周りは欲しいですね。 Pcre.replace と Pcre.substitute の両方のインタフェースが欲しいなぁ、と思います。 もっとも、実は重要なのは正規表現定数と文字列置換 ("$var") で、この2つがあれば、 Pcre.substitute を素直に呼べばよかったりもするんで、重要度はちょっと低めではあります。 Regexp/OCaml では文法がうまくはまらなかったので、この部分はスルーされてます。

あとは……今自分の周りの Perl スクリプト見回してたんですが、募ったのは拡張に欲しい機能より むしろPerl に欲しい機能でした(苦笑)。match...with というか、switch というか、 あれが if..elsif..elsif..end でしか書けないのは非常に気持ち悪いんですよねぇ。

あとは、これは多くの人が欲しいと思っているような気がしますが、break/continue (last/next) が欲しいです :-) これも lexer 拡張要らないですけど :-)


大岩 寛 (おおいわ ゆたか) <yutaka@oiwa.jp.nospam ... remove .nospam> .

Copyright © 2005-2014 Yutaka OIWA. All rights reserved.
Posted comments and trackbacks are copyrighted by their respective posters.

記事の内容について (Disclaimer / Terms and Conditions)