From: KOSAKI Motohiro Date: 2010-10-15T09:28:24+09:00 Subject: [ruby-dev:42387] Re: [Ruby 1.9-Feature#3946][Open] Array#packのqQ指定子に機種依存サイズフラグ!を追加 > (2010/10/14 21:07), Tanaka Akira wrote: > >> さて、q/Q は 64bit signed/unsigned int なのですが、機種依存の long long (厳密には LONG_LONG) の > >> サイズが必要な場合、現状 Ruby レベルから取る手段が一切ありません。 > >> すでに s/S/i/I/l/L (16bit/32bit/32bit) は、! をつけることでその機種の short/int/long の > >> サイズになるため、これを q/Q に拡張すると唯一の手段が提供される事になります。 > > > > おそらく long long がない場合にはエラーになるべきだと思うんですが、 > > その場合のエラーを決めないといけないんじゃないでしょうか。 > > ふむ。 > 現実的には 64bit 以上の整数型がない環境ですよね。 > rb_raise(rb_eArgError, "this machine doesn't have long long int"); > あたりになりますかねぇ。 あんまりRubyのexceptionのルールを知らないんですが、 ・引数が間違っている だと、暗黙にプログラムがバグっているというニュアンスを持つので ・そのプラットフォームは未対応 ってのは、違うエラーが一般的な気がします。Unix errnoルールでいうと EINVAL: 引数が待ちガットル ENOSYS: 未実装システムコール みたいな。 余談に走りますがglibc関係者がkernel開発者に以前この件で苦情を言ってきた 事があって、それは ・ユーザが引数を間違えて渡してきた時はエラーを返したい ・カーネルが古くて、新しめのシステムコールが未実装の時は 代替処理にfallbackしたい という事はわりとありがちなので混同しないで、とかいう話でした。 今回の件に当てはまるかどうかは分かりませんが。 ああ、でもこのへんもperlにあわせたほうがいいのかな?