Alternative zero-based subscripting code
- To: MathGroup at yoda.physics.unc.edu
- Subject: Alternative zero-based subscripting code
- From: villegas
- Date: Thu, 30 Jul 92 19:43:37 CDT
Here is a slightly shorter version of the zero-based subscripting function which takes advantage of the ability to add a number to all elements of a list, and the fact that pure functions can be used with Apply as well as with Map: ZPart[obj_,partlist___Integer?NonNegative] := Apply[Part[obj, ##]&, 1 + {partlist} ] The construct "##" in the pure function stands for the whole sequence of arguments fed to the function. If {partlist} is {0, 3, 0, 2}, then 1 + {partlist} --> {1, 4, 1, 3}. So the Apply of the pure function ends up constructing the command Part[obj, 1, 4, 1, 3]. The restriction in the pattern to nonnegative integers is to prevent this from being used on part-specifications involving negative coordinates, which indicate positions measured from the end instead of the beginning. If you wanted to enable negative coordinates, you could make it: ZPart[obj_,partlist___Integer] := Apply[Part[obj, ##]&, Map[If[NonNegative[#], # + 1, #]&, {partlist}] ] The If will avoid adding 1 to negative coordinates, so you can mix the desired zero-based indices with the existing convention for negative indices. Robby Villegas P.S. An interesting, purely mathematical way to do what the Map of the If does, without any programming needed, is: {partlist} + Sign[1 + Sign[{partlist}] ]