出現評価

http://d.hatena.ne.jp/shinichiro_h/20061124#1164309160
うやむやにしてたけど触れられてたので書いとく。


C++コンパイル時計算では、遅延評価とも正格評価とも違う評価のしかたをする、というようなのを主張したくて、怪しげな単語を作ったという経緯。
shinh氏には当たり前すぎて、わざわざ触れるまでもなかったことなのかもしれないのですが、普通のプログラミング言語から、コンパイルC++に移った人(どんな人だ)がまず悩む点だと思うので一応説明。

template < int N >
class loop
{
	typedef typename loop<N-1>::result result;
};

typedef loop<30> x;
x a;

まず、こんな感じで、無限ループするようなのがあったとして。

/* 条件分岐 */
template < bool cond,
	   typename Then,
	   typename Else > class if_;

/* trueだったらThenを返す */
template < typename Then, typename Else >
class if_<true,Then,Else>
{
public:
	typedef typename Then::result result;
};

/* false略 */

/* 無限ループ */
template < int N >
class loop
{
public:
	typedef typename loop<N-1>::result result;
};


/* さてこれは? */
typedef if_<true,
	    int,
	    loop<0>::result >::result x;

Cで書くと、

if ( true )
	return int;
else
	while(1) ;

こんな感じ。でも、コンパイルC++だと、何故か無限ループ。テンプレートの引数になる時点で実体化するから、とか、そんなの。
これをなんとかしたものに、boost::mpl::apply_ifというのがあって…と思ったけど、apply_if見つからん。
ともかく、apply_ifというのがあって、なんかごにょごにょすると、何故か、上のようなコードでも無限ループしない。とか、そういう怪しげな評価順序を表現したいという意味で、怪しげな単語を作ってみましたという話。