```On Thu, 11 Oct 2001, Guy N. Hurst wrote:

>
> Luigi Ballabio wrote:
> > ...
> >  >>> l = [(x,y) for x in range(1,5) for y in range(1,5) if x+y < 5]
> >  >>> l
> > [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (3, 1)]
> >
>
> irb(main):006:0> l=[]; (1..5).each{|x| (1..5).each{|y| l<<[x,y] if x+y<5}}
> 1..5
> irb(main):007:0> l
> [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [3, 1]]
> irb(main):008:0>
>
Might it be useful with Range#*?

class Range
def *(aRangeOrArray)
a = []
self.each {|e| aRangeOrArray.to_a.each {|oe| a << [e,oe]}}
a
end
end

p ((1..5) * (1..5)).select {|x,y| x+y < 5} # => [[1, 1], [1, 2], [1, 3],
[2, 1], [2, 2], [3, 1]]

or even extending Array#*?

class Array
def *(a)
if a.respond_to?(:to_a)
cart_prod = []
self.each {|e| a.to_a.each {|oe| cart_prod << [e,oe]}}
cart_prod
else
super(a)
end
end
end

p ([1,2,3] * (1..5)).select {|x,y| x+y < 5} # => [[1, 1], [1, 2],
[1, 3], [2, 1],
[2, 2], [3, 1]]

Maybe not for std Ruby; probably rare and not efficient (generate then
filter).

Regards,

/Robert

```