水面下でコーディングが続いている cflat コンパイラ (プロトタイプ Ruby 版)。 いつの間にかポインタが使えるようになった。
~/c/cflat/test % cat pointer.cb
int
main(int argc, char **argv)
{
int i;
int *ptr;
ptr = &i;
*ptr = 5;
printf("%d;%x\n", i, *ptr);
return 0;
}
~/c/cflat/test % rm -f pointer
~/c/cflat/test % make pointer
ruby -I../lib ../bin/cbc pointer.cb
~/c/cflat/test % ./pointer
5;5
いまだにレジスタアロケーションを真面目にやっていないので、 アセンブリのコードがかなり笑える。
(07:01)
なーんか以前から Tru64UNIX のマシンに scp できなくて困ってたんだけど、 ようやく原因が判明した。 Tru64UNIX は商用 SSH (SSH2) が入ってるので、 OpenSSH な Linux とは scp の互換性がないらしい。
しょうがないので、次のように ssh コマンドを使って代用する。
% tar cf - ruby-1.8.?.tar.gz | (ssh tunami "cd /usr/users/aamine; tar xf -")
(12:52)
なんかすげー笹田さんが嫌がりそうなところを突いてしまった。 ネストしてる rescue の内側の、rescue に入る前で retry するとエラーになる。
~ % cat t
ret = false
begin
puts 'outer rescue'
exit if ret
begin
puts 'inner rescue'
exit if ret
ret = true
retry
rescue
end
rescue
end
~ % ruby t
outer rescue
inner rescue
t:13: retry outside of rescue clause
元のコードはこんなの。
when link?
begin
File.symlink linkname(), path()
rescue Errno::EEXIST
begin
File.unlink path()
retry ← ファイルをunlinkできたら改めてシンボリックリンクを作る
rescue SystemCallError
end
end
うーむ、これは ruby-dev に投げるべきかどうか、微妙だ。 簡単に回避できるしな。
(15:42)
これって仕様どおりじゃないの?
その仕様を変えたほうがいいんじゃないか、
と提案したほうがいいような、しなくてもいいような、
微妙なところだなあということ。
あー、やっと問題がわかった。うーん、確かに悩ましい。
あれ、サンプルコード間違ってない? だから勘違いしたんだ。
begin
(p :exit; exit) if (count += 1) > 1
raise
rescue
p count
begin
p :retry
retry
rescue
end
end
は1.8.5でもYARVでも動くよ。
count = 0 忘れた。
げ、本当だ。テストスクリプトが間違ってただけか!
これは恥ずい。しつれいしますた。