history

青木日記 RSS

<前の日 | この月 | 次の日>

2006-12-31

そうだコンパイラ作ろう (n+1)

水面下でコーディングが続いている 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)

Linux → Tru64UNIX の scp

なーんか以前から 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 から retry

なんかすげー笹田さんが嫌がりそうなところを突いてしまった。 ネストしてる 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)

本日のツッコミ(全6件) [ツッコミを入れる]
ささだ (2006-12-31 19:06)

これって仕様どおりじゃないの?

青木 (2007-01-03 12:25)

その仕様を変えたほうがいいんじゃないか、
と提案したほうがいいような、しなくてもいいような、
微妙なところだなあということ。

ささだ (2007-01-03 15:59)

あー、やっと問題がわかった。うーん、確かに悩ましい。

ささだ (2007-01-03 16:23)

あれ、サンプルコード間違ってない? だから勘違いしたんだ。

begin
  (p :exit; exit) if (count += 1) > 1
  raise
rescue
  p count
  begin
    p :retry
    retry
  rescue
  end
end

は1.8.5でもYARVでも動くよ。

ささだ (2007-01-03 16:24)

count = 0 忘れた。

青木 (2007-01-03 17:28)

げ、本当だ。テストスクリプトが間違ってただけか!
これは恥ずい。しつれいしますた。

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS