/*
* call-seq:
* dvector[int] -> number or nil
* dvector[start, length] -> dvector or nil
* dvector[range] -> dvector or nil
* dvector.slice(index) -> number or nil
* dvector.slice(start, length) -> dvector or nil
* dvector.slice(range) -> dvector or nil
*
* Element Reference---Returns the element at index _int_,
* or returns a subvector starting at _start_ and
* continuing for _length_ elements, or returns a subvector
* specified by _range_.
* Negative indices count backward from the end of the
* vector (-1 is the last element). Returns <code>nil</code> if the index
* (or starting index) are out of range. If the start index equals the
* vector size and a _length_ or _range_ parameter is given, an
* empty vector is returned.
*
* a = Dvector[ 1, 2, 3, 4, 5 ]
* a[2] + a[0] + a[1] -> 6
* a[6] -> nil
* a[1, 2] -> Dvector[ 2, 3 ]
* a[1..3] -> Dvector[ 2, 3, 4 ]
* a[4..7] -> Dvector[ 5 ]
* a[6..10] -> nil
* a[-3, 3] -> Dvector[ 3, 4, 5 ]
* # special cases
* a[5] -> nil
* a[5, 1] -> Dvector[]
* a[5..10] -> Dvector[]
*
*/ VALUE dvector_aref(int argc, VALUE *argv, VALUE ary) {