#begin0の最適化入れたので、HEADではgiterate0とgiterate0-1は同じコードになります。
#なるほど、そういえばgauche.generator読んでて%begin0なるほどと思ったばかりだったのに気付けませんでした(。>﹏<) マクロ書いてて多値対応したいけど遅くなる葛藤よくあるので、単値しか来てないと最適化入るのは嬉しいですね。
#実は最初は giterate0 で f が1回余分に(1歩先の分まで)適用されるのが嫌で giterate1 書いたんですよね。ジェネレータは副作用を伴う計算にしばしば使われることを考えると、ちょっと嫌かなあと。
#なので、giterate(ベンチマークのgiterate1-1)とgiterate1(ベンチマークのgiterate2)を入れるっていうのが本命だと思っています。あとliterate。名前がこれでよければ。
#あっそれもあるか>1回余分。gcons*が条件判断と追加の関数呼び出し分遅くなるのを何とかできればなあ。名前はこれで問題ないと思います。同型の関数がscheme.streamにstream-iterateとしてありますし。
#あ、追加の関数呼び出しは削れるか
##;;こうすれば条件分岐省けるけど、速くはならなかった
(define (giterate1-3 f x)
(let ((g identity)
(x x))
(^[]
(set! x (g x))
(set! g f)
x)))
#set!するとその変数へのアクセスもbox経由になるからset!しない変数より重くなる
#なるほど。Gaucheの最適化にも興味あるので、勉強になります。
#giterateほか、pushしました。
#わーい、ありがとうございます。