Gauche > Archives > 2010/06/10

2010/06/10 13:39:28 UTCkiyoka
#
Nendoで末尾再帰最適化の実装方法としてRubyのcallccを使いたくなってきました。
#
今のところJRubyとかRubiniusがcallccをちゃんとサポートしていないので、CRubyでしか実現できないのですよね。
#
catch throwによるループの脱出で代替できればいいんですが、望み薄な感じです。
2010/06/10 19:42:36 UTCshiro
#
CRubyが内部的にCPSを使っていない限り、相当重くなるような気がします。
2010/06/10 19:50:11 UTCshiro
#
Nendoが生成するRubyコードが読みにくくなっても良いなら、トランポリンをうまく挿入すればいいんじゃないかと思うのですが。末尾位置での呼び出しを、直接呼び出すのではなく、「この関数をこの引数で呼び出してね」というパケットにして返します。
#
呼び出し側では、末尾位置以外の呼び出しで戻り値が「呼び出してね」パケットであるかどうかを確認し、そうであれば改めてパケットが示す関数を呼びます。末尾位置の戻り値はそのまま返してOK。
2010/06/10 20:26:38 UTCshiro
#
そんな読みにくくならないか。末尾位置以外の関数呼び出しを全部 TrCall() みたいのでくくってやるだけでいいかな。TrCallは戻り値がトランポリンパケットなら改めて中身の関数を呼ぶ。
2010/06/10 22:05:38 UTCふじさわ
#
こんにちは。以前Gauche 0.9がリリースされたときに、ARMがなんちゃらって話があった気がしたんですけど、ARMやARM EABIはサポートしてるんでしたでしょうか? いまDebian/armel上でセルフコンパイルしてるんですが、コケちゃうんですよねー。
#
具体的には、src/gosh -ftestでgoshを起動して、1.0とか浮動小数点数を食わせると落ちるようです。
#
あ、「落ちる」というところ、正確にいうとSegmentation faultします。
#
タイミング的には、ext/charconvに入ってguess.scmからguess_tab.cを作ろうとした時点で、scoreに定義されている浮動小数点数を読もうとしたらSegmentation fault、という感じでした。
2010/06/10 22:13:42 UTCshiro
#
えーっとそのfixは2009-11-29に入ってますね。
#
0.9の後だ。ということはtrunkを使ってもらうしか。
2010/06/10 22:32:34 UTCふじさわ
#
お、そうなんですね。ありがとうございますー。やってみます!