さっそく半分に縮んだらしい

昨日のGrassの話http://d.hatena.ne.jp/nishiohirokazu/20080606/1212754828

さっそく半分に縮んだらしい。
→ GrassのHello World - * *scrap* http://d.hatena.ne.jp/youz/20080606/1212769842

なるほど。Grassはスタックの頭から深いところにある値を触るのに深さに比例した文字数が必要だけど、引数をそのまま返す関数Iを作っておけば深いところにある関数をスタックの頭に積むことができる。深い関数を2回触るなら、1回Iを呼んでスタックの頭に積み直してしまった方が短くなるというテクニック。しかしwvでIになるのは盲点だった。

あと、僕は

+2 = \x -> Succ(Succ(x))
+4 = \x -> +2(+2(x))
...

という感じで大きく値を変えるための関数を作成していったのだけど、最初に与えられた関数を2回適用する関数dblを作ってしまうという手があったのね。

dbl = \x -> (\y -> x(x(y)))
+2 = dbl(Succ)

与えられた数を作るのに、どうすれば最短手数なのか、ってのは意外と深い洞察が必要になりそうな予感。Brainf*ckのコードジェネレータを作ろうとしたときにもちょっと考えかけたけど…