In article <20041205093023.GA26381@navi.cx>, luke@luqui.org (Luke Palmer) wrote: >But what we'd really like to do is: given the user knows what push/pop >do, what would they *guess* to mean shift (I tend to think that this >is a very good technique for naming). >And, well, I'm thinking pull. So it's a toss-up between shift/unshift >and put/pull. I think "push" and "pull" fairly naturally could be taken to refer to the front of an array; you might even argue that the natural direction for something to "pop" is away from you (i.e. off the back) The problem I have with push/pull referring to opposite ends is that the same person is doing the pushing and the pulling, so both words ought to apply to the same end of the array (the front end), which violates the comp-sci-y expectations. (And although normally I'm happy to chuck CS jargon out the window, because so much of it is really bad, the push/pop thing goes pretty deep.) Not to mention everyone coming from Perl <6. Though if we had "push" without "pop", that wouldn't be as bad. I guess we could always use prepend/append, pull/pop. You might not guess what they meant, but once you know, I think the meanings are reasonably "obvious". (Dislike typing though I may, I'm hesitant to suggest "prep" and "app".) Hm, actually counting letters, "prepend" is no longer than "unshift" (and if not a real word, is at least used as one more often than "unshift" is). In fact, prepend/append/pull/pop altogether are only one letter more than push/pop/shift/unshift. So those are now officially my preferred replacements. But if we want something that makes it immediately obvious what end of the array we're messing with.. something visually obvious... ooh, this sounds like a job for Unicode!! (Just kidding. Sort of.) We've already got those lovely pipe operators to build on, and they can already do assignment; if you can go from = to +=, why not from <== to +<==? @a <== $foo, $bar; # @a=($foo, $bar) $foo, $bar ==> @a; # ditto @a +<== $foo, $bar; # push @a, $foo, $bar $foo, $bar ==>+ @a; # unshift @a, $foo, $bar @a -==> $foo, $bar; # ($bar, $foo) = (pop @a, pop @a) $foo, $bar <==- @a; # ($foo, $bar) = (shift @a, shift @a) The + or - tells you whether you're adding on or taking away, and the arrow points to (or from) the end of the array you're doing it to. (I know some people will hate four symbols in a row. That's why we have seven-letter alternatives like "prepend".) I was going to say an advantage over old-fashioned pop/shift is that you could remove more than one element at a time, but there isn't any reason for their P6 versions not to return as many items as are want()ed, is there? The bad news (assuming anyone actually thinks there's anything good in the above suggestion) is that since +<== and friends are assignment operators, you can't just do foobar( @a-==>, $x, $y). Um, unless -==> could be made to work as a unary operator. Which even I don't think I like. =) So we should keep the wordy versions too. -David "pull goes the weasel" GreenThread Previous | Thread Next