From: gltewalt@... (illocutionist) Date: 2004-11-10T20:48:33+09:00 Subject: Re: reverse #succ ? "trans. (T. Onoma)" wrote in message news:<200411100147.53481.transami@runbox.com>... > (Thanks to all who have taken some time with this and String Range thread.) > > On Tuesday 09 November 2004 10:28 pm, illocutionist wrote: > | > On Wednesday 27 October 2004 01:17 am, Hal Fulton wrote: > | > | trans. (T. Onoma) wrote: > | > | > Is there a reverse #succ for String? If not, could there be? > | > | > | > | It's one of those things that looks easy until you try it. > | > | > | > | There are too many "edge cases" that require judgment about how > | > | to generate the next value. > | > | > | > | Search the archives, it's been discussed off and on for five years. > | > > | > Thanks and yes the archives are back up. I found a few hits. I see the > | > problem. Though, I don't really care if it's a one-to-one match to #succ. > | > I would just prefer that my Range#reverse_each method doesn't blow up ;) > | > Certainly there must a basic #pred method that makes sense. > | > > | > Then again how much use does String#succ actually get? And what for? Can > | > anyone really give a use case truly dependent on the specific current > | > behavior? Would it make more sense if it were simply an ascii "dial", > | > within a particular range of characters? And perhaps too that particular > | > range could have a redefinable specal global. > | > > | > T. > | > | #pred leads to the gates of madness. > | Mr. Fulton is right in that it doesnt sound too hard to > | implement until you try it. > > Almost. I managed to dig up a working #pred method in ruby-talk archives. I > think robert wrote it (have to check to be sure), but it works well enough, > given that it would probably never be used ;) > Take a gander at Mr Fernandez's stab at it under: The Opposite of .succ! (Young and foolish I was) *Now I'm old and foolish, but thats another thread* > | I have used String#succ to ummm, 'test', the strength of passwords. > | The current implementation doesnt allow that if a password uses more > | printable chars than letters or numbers. > | > | An ascii 'dial' with a definable, or redefinable, range would be just > | perfect. > | ascci_succ ? > | 'z9'.succ => 'aa0' > | 'z9'.a_succ => 'z:' > | > | I just wonder if it should be a 'wheel' or 'dial', or if it should just > | have borders. 'a'.. 'the_end_of_the_line' of printable char range. > > It has become increasing apparent to me that string ranges are of very limited > use --primarily they seemed to be used just to get a list of letters a-z. consider this little bit o' perl: $hexdigit = (0 .. 9, 'a' .. 'f')[$num & 15]; ^ the ability to do this would be nice. > While I'm sure there are at least a couple cases out there somewhere in which > the current behavior is quite useful, a number of of alternates have been > suggested to make it even more so; the general "dial" being one of them. > Another interesting idea is dictionary-order given a "depth" parameter. For > instance: > > 'a'.succ(1) #=> 'b' > 'z'.succ(1) #=> nil (nothing after z of depth 1) > 'a'.succ(2) #=> 'aa' > 'aa'.succ(2) #=> 'ab' > 'az'.succ(2) #=> 'b' > 'b'.succ(2) #=> 'ba' > Yikes. No, that would breed much confusion for the average user. It could be usefull, but IMO, would be a huge mistake if added to the standard. Too easy to trip oneself up. I would vote for the wheel first. > and so forth. Of course other methods would require adjustment to handle the > parameter, but that is fairly easy to do. No doubt there are other variations > of a more useful #succ as well. > > Clearly what would be better is some sort of Iterator / Enumerator / > Generator, perhaps provided by a String class method to which parameters can > be passed to determine behavior --or perhaps a few such methods. For example, > one method might be as above: > > sg = String.dict_enum('A-B', 2) > sg.to_a > #=> [ 'A', 'AA', 'AB', 'B', 'BA', 'BB' ] > > Speaking of which, if any one has a general purpose string generator, I would > really love to get a hold of it. > > My overall conclusion is that string ranges have held back the Range class. On > suby-ruby we have been able to get Range to behave uniformally even with > string ranges. This required using an alternative comparesion method (#cmp > instead of #<=>). But given the limited usefulness of the current String#succ > in contrast to the other useful possibilities for generating a list of > ordered strings, plus the "headache" it causes Range to support it, it seems > to me that it might be better just to let it go. Besides, it is easy enough > to do: > > ?a..?z > > If one needs simple character enumeration. > > Opinions on this are greatly welcome. > > T. > > P.S. Of course, if anyone can figure out a way to create a one-to-one > correspondence between strings and floats, then we'd have whole new ball game > on our hands!