笠原です。

* From: matz / netlab.co.jp (Yukihiro Matsumoto)
* Date: Fri, 30 Oct 1998 17:37:32 +0900

> 私が考えていたのは,参照については
> 
>   a = [1,2,3]
>   a[-4]                 #=> 配列外なのでnil(現状は1)
>   a[-4,0]               #=> 配列外なので[](現状も[])
>   a[-4,1]               #=> 配列外なので[](現状は[1])
>   a[-4,2]               #=> 配列外を除く[1](現状は[1,2])
>   a[-4..-4]             #=> 配列外なので[](現状も[])
>   a[-4..0]              #=> 配列外を除く[1](現状も[1])

これで良いと思います。最後の a[-4..0] は、

	a[-4..0]
	→ 配列外の a[-4] を除くので a[-3..0] と等価
	→ a[0..0]
	→ [1]

ということですね。


> で,代入については,
> 
>   * 前方の配列外への代入は例外
> 
>   * (負の位置からスタートする)範囲指定で配列に重なる部分があ
>     れば,そこだけを置き換える
> 
> というのはどうだろうか,というものです.
	:
> 前方への自動拡張は考えていませんでしたが,どうなんでしょう.
> 勝手にシフトするのは良くないというような気がしないでもないで
> すが….

別に前方への拡張にこだわりはないので、これで良いです。それぞれ 
a = ["a","b","c"] のとき、以下のような結果で合っていますか?

  a[-4] = 0		  # すべて配列外なので例外
  a[-4,0] = [0]           # すべて配列外なので例外
  a[-4,1] = [0]           # すべて配列外なので例外
  a[-4,2] = [0,1]         # a[-4] の分を除いて設定: a => [1,"b","c"]
  a[-4,5] = [0,1,2,3,4]   # a[-4] の分を除くので a[-3, 4] つまり a[0, 4]
                          # に設定: a => [1,2,3,4,"a","b","c"]
  a[-4..-4] = [0]	  # すべて配列外なので例外
  a[-4..0] = [0,1,2,3,4]  # a[-4] を除いた a[0..0] に設定:
                          # a => [1,2,3,4,"a","b","c"]


> |これは何故なのでしょうか。
> 
> ミスフィーチャというかほとんどバグですね.長さチェックより配
> 列拡張のチェックが先に来てたせいです.負の長さはいつも例外に
> するようにしましょう.

はい。よろしくお願いします。
______________________________________________________________________
                                          笠原 基之(かさはら もとゆき)