水面下でコーディングが続いている 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)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
これって仕様どおりじゃないの?
その仕様を変えたほうがいいんじゃないか、
と提案したほうがいいような、しなくてもいいような、
微妙なところだなあということ。
あー、やっと問題がわかった。うーん、確かに悩ましい。
あれ、サンプルコード間違ってない? だから勘違いしたんだ。
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 忘れた。
げ、本当だ。テストスクリプトが間違ってただけか!
これは恥ずい。しつれいしますた。