[Rd] Patch to allow negative argument in head() and tail()

François Pinard pinard at iro.umontreal.ca
Wed Jul 19 16:29:47 CEST 2006

[Martin Maechler]

>  Regarding unix command line compatibility:
>  Note that there, 'tail'  is *really* not what we want to imitate:

>  "3" is the same as "-3" but different from "+3" :

>I know that there is some "good" reason for the behavior of
>'tail' in "Unix" 
>  { tail -3 === tail -n  3   and
>    tail -3 === tail -n -3      }                            ***

>but of course, we can't be compatible here, because in S
>(and most reasonable languages :-) 
>"3 == +3"  and  "3 != -3" !

I'm not sure I understand you fully, or maybe there is a typo on the 
starred line above.  When I speak about GNU "head" and "tail" behaviour,
I'm really meaning the internal behaviour once option values have been 
decoded, but certainly not option representation themselves.

The strange spirit of Unix designers show, where while `-' is only meant 
as an option introducer, by a kind of typographical pun, it is 
temporarily seen a negative sign when the time comes to negate a value, 
and this is the reason `+' was sometimes used, that is, as a humorous 
way to mean a minus sign in option context.  So, `+' really means `-' 
sometimes.  This is a similar kind of humour which later yielded 
a better "more" program to be named "less" :-).

For "head" and "tail", these programs were accepting a number as first 
argument without requiring it to be introduced by the usual `-'.  POSIX 
later came in and got rid of this irregularity.  Moreover, within GNU, 
`+' option introducer was once reserved for so called "long options" and 
consequently unavailable for the above pun, but later freed again when 
the `--' convention was adopted instead of `+' for long options.  Many 
implementations attempted to be compatible to both POSIX and pre-POSIX 
specifications.  GNU implementation also had to cope with their own 
varying option standards, as well as a lot of contradictory pressure 
from users and within.  Even nowadays, as a futile attempt to reconcile 
some incompatible trends that cannot be dismissed, a few environment 
variables can be set to alter how these tools interpret and decode the 
value of the dreaded option.  As you may guess, confusion resulted, and 
those of us who followed it all never fully recovered from all the brain 
damage :-).  [Another tiny corner of Unix where sign confusion blatantly 
existed was "nice", this tool meant to alter process priority.]

*Once* the real value has been decoded out of the option, the current 
convention is as follow, given that N is a positive number:

  Value  "head" tool                    "tail" tool

  N      Show N initial lines           Show N last lines
  -N     Show all but N last lines      Show all but N first lines

Hoping that this clarification may be helpful in the whole thinking! :-)

François Pinard   http://pinard.progiciels-bpi.ca

More information about the R-devel mailing list