Let's start Scheme

2006-11-21

プリミティブ

相変わらずspiritのことである。
spiritは自前でファンクタを作らないと標準でくっついてるのでは間に合わないことが多い。
ということで、マニュアルに従ってファンクタを作ってみた。
(これはspiritのサンプルに存在しているファンクタだが)

struct print_val
{
  template < typename IteratorT >
  void operator()(IteratorT first, IteratorT last) const
  {
    std::string str(first, last);
    std::cout << str << std::endl;
  }
};

なんのことはない、マッチした「文字列」を表示するだけなのだが、
これが2時間くらい悩むもとになった。
上記のファンクタを以下のセマンティックアクションに適用させた。

  +anychar_p[print_val()]

これがコンパイルエラーになるのである。
予定通りにするためには以下のように記述する必要がある。

  (+anychar_p)[print_val()]

演算子の順番の問題だけなんだけど、
anychar_pはあらゆる「1文字」にマッチするので、
ファンクタで定義したIteratorTがおかしなことになるということだった。
しかも、コンパイルエラーが

  const charはconst char*に変換できない

とでるだけだから、知らなきゃ意味不明なコンパイルエラーになる。
こういったことが起きないように、文字列を解析するパーサを作成した方がいいのかもしれない。

No comments:

Post a Comment