From: "NARUSE, Yui" Date: 2010-10-15T16:27:08+09:00 Subject: [ruby-dev:42390] Re: [Ruby 1.9-Feature#3946][Open] Array#packのqQ指定子に機種依存サイズフラグ!を追加 2010年10月15日9:28 KOSAKI Motohiro : >> (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したい > > という事はわりとありがちなので混同しないで、とかいう話でした。 > 今回の件に当てはまるかどうかは分かりませんが。 一理あるとは思うのですが、 * packは後述の通り間違った指定子は無視する * NotImplementedError が一見それに見えて確か違う……と見せかけてrdocみるとこれっぽいな というわけで、rb_eNotImpError かも。 > ああ、でもこのへんもperlにあわせたほうがいいのかな? Perl を見ると、 > (Quads are available only if your system supports 64-bit > integer values _and_ if Perl has been compiled to support those. > Raises an exception otherwise.) > http://perldoc.perl.org/functions/pack.html などとあり、実際試しても以下の通りエラーですね。 % perl -e'print pack("q",1)' Invalid type 'q' in pack at -e line 1. ちなみに、全く非対応な文字を食わせた場合、 % perl -e'print pack("o",1)' Invalid type 'o' in pack at -e line 1. % ruby -e'p [1].pack("O")' "" すごく……仕様変更したいです…… -- NARUSE, Yui naruse@airemix.jp