2005年10月15日
実践いやな法則: にわかな奴、一蹴される
先日、 にわかな奴ほど語りたがるという記事を書きました。にわかな奴ほど語りたがるけど、それにはポジティブな面もあるよ、という内容です。 今日はその「にわかな奴ほど語りたがる」を実践してあっけなく一蹴されるという出来事があったので紹介したいと思います。
C++ から D言語に移行したという人と話す機会があり、C++ は難しいという話題になりました。ここぞとばかりに、最近のにわかな知識を持ち出して「テンプレートクラスの中のテンプレートメンバ関数をクラス定義の外で定義するときの文法って難しいですよね」と少々自信を持って話を切り出したところ、「そんなの普通じゃないですか! よくありますよ!」と一喝。ちなみに、その文法とは以下のようなものです。
template<typename T> template<typename TT> TT Foo<T>::func(T x, TT y) { ... }
「それよりも、これを見てください」といって見せられたのが以下のようなコンパイルエラーです。「これはですね、カックロ電卓という数学パズルを C++ のテンプレートを使って解いてコンパイルエラーとして表示しているんです。型名の部分が解になっていますから、 9, 8, 7, 5 ですね」
% g++ -DM_VAL=4 -DN_VAL=29 meta_kakro.cc kakkuro.cpp: function 内の `int main()': kakkuro.cpp:67: error: conversion from `int' to non-scalar type ` boost::mpl::v_item<boost::mpl::vector<boost::mpl::l_item<mpl_::long_<4>, mpl_::integral_c<int, 9>, boost::mpl::l_item<mpl_::long_<3>, mpl_::integral_c<int, 8>, boost::mpl::l_item<mpl_::long_<2>, mpl_::integral_c<int, 7>, boost::mpl::l_item<mpl_::long_<1>, mpl_::integral_c<int, 5>, boost::mpl::l_end> > > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, 1>' requested
もっと早く気づくべきだったのですが、私が話していたのは、私のにわかなレベルなど遥かに超えたところにいるお方だったのです。まさに「導師に一蹴される門弟」の状態です。
「STL はもうだいぶ忘れちゃったなー」という導師の過去のコードを見せてもらうと、次のようなステートメントがありました。
std::remove_copy_if( descriptionsDisplayOrder_f.begin(), descriptionsDisplayOrder_.end(), std::back_inserter(ret), boost::compose_f_gx( std::bind2nd(std::not_equal_to<std::string>(), groupSysname), std::mem_fun(&BulletDescription::group)));
これはまさに Effective STL で「やってはいけない」とされている Scheme オタク的 C++ コードです。関数渡しあり、関数合成あり、カリー化あり、と関数プログラミングの技が C++ で見事に結晶しています。
導師によると「僕なんかまだまだですよ。sed で BASIC→x86 コンパイラを書いたり、 Make で qsort を書いたりと、僕なんかよりはるかに奥が深い方がいますね」とのこと。
にわかな奴は、このようにして一蹴されました。