MOO-cows Mailing List Archive


Re: [wish list]: perl stuff

H. Peter Anvin wrote:

> >
> > Somewhat Perly.  The ability to reference '[a..b]' as if it were an
> > inclusive list of all integers 'a' through 'b'.  Like...
> >
> >         if (foo in [5..8])
> >
> > Rather than...
> >
> >         if ((foo > 4) && (foo < 9))
> >
> This is, by the way, hideously inefficient and would cause severe
> server spam, since you are needlessly creating a list when you don't
> need to.  Perl gets around this by having a pretty extensive
> optimizer, but developing one for MOO would be a *lot* of work.

Why does it have to create a list?  Why would it be a lot of work?
Both syntaxes would basically do the same thing...but the
'if (foo in [5..8])' one would be smaller in MOO code and probably
would use fewer bytes when tokenized.  It wouldn't have to generate
a list of {5, 6, 7, 8} to see if foo is in it...the bytecodes for
this particular use of the 'in' operator would just have to generate
a comparison similar to 'if ((foo >= 5) && (foo <= 8))'.

The behavior of 'in' already changes, depending on whether it is
in a normal expression, or in a for..endfor statement.  It wouldn't
be as hard as you think to make [x..y] a valid operand for 'in' in
a normal expression.  ATM it's not.

If you really wanted to have fun, make something like this:

  ;[1..5] in [3..8]
  => [3..5]

What we would then be implementing is a new datatype for ranges.

  ;typeof ([5..8])
  => RANGE

But now that you mention it, it would be neat to be able to create
a list by something like

  foo = {@[5..8]}

which would return

  {5, 6, 7, 8};

or even use object numbers, like

  if (foo in [#1..#90])

  foo = {@[#1..#90]}

It wouldn't be incredibly frequently used, but it would have
a use.


Home | Subject Index | Thread Index