depth

古いソースを見ていたら depth を deapth と綴っていて学力低下だなあと思いました。

前提知識。
qsort はC言語の「ちょっぱやで並び替える関数」。関数っていうのは入力があって出力があるものね。qsort(トランプ一組, 52枚, カードの順番を決める関数) とやると、小さい順に綺麗に並べられたトランプがでてくる。カードの順番を決める関数っていうのは、例えば、大貧民順とかホイスト系の順とか辞書順とか色々あるわけですよ。で、順番を決める関数はカードを二枚とって、先に入ったほうがが大きいか小さいか同じかを、正の数、負の数、0 を出すことでその順に並べようとするの。
なんで qsort っていうと quicksort というアルゴリズムから名前を取っているんだけど、それはISBN:4001152665「山の背くらべ」あたりに譲りますね。これ絵本です。

C言語で qsort 使ってて用意されている cmp とは逆順で並べたい。あるいは、cmp0 が 0 を返したら cmp1 で判定して…、みたいなことがしたい。少しだったらいいけれども、比較関数は10以上ある。
Haskell だったら lambda が簡単に作れるから、はじめのほうは

curry$(0-).uncurry cmp

とか

(\cmp x y ->(0-) (cmp x y))

でいいし、なんか、後のほうは中値演算子 (%%)でも定義してやって

(%%) f g a b = if f a b == 0 then g a b else f a b

とでもすれば、f %% g %% h で順次評価してくれそう。

でまあ、一応 better C としての C++ ではあったので http://www.kmonos.net/alang/boost/classes/lambda.html を使ってもいいのだけれども、 curry化されていないし、http://nicosia.is.s.u-tokyo.ac.jp/pub/essay/hagiya/h/curry なんとなく移植性が損なわれるようで嫌だ、と、ごにょごにょやってたら lex ではないけれども文字列を解釈するものを作ってしまい、なるほど、難問でなくても、

あなたが難しい問題を解こうとしているなら、 問われているのはパワフルな言語を使うか使わないか、ではない。
(a)パワフルな言語を使うか
(b)パワフルな言語と等価なインタプリタを書くか
(c)自らがパワフルな言語の人間コンパイラとなるか
、という選択なのだ。

ということが分かった。
それで、ここに晒そうかと思ったが、ライセンスが public license に汚染*1されていることに気がついたので中止。

あ、でもC言語いいよ。このCPUが必死になって作業している様がよく伝わってきて。高速化楽しいし。

う〜む。適当すぎる。

*1:いや、悪い意味はないけど。というかそのために書いたのだけどさ