Cute open range?

Discussion in 'Ruby' started by Clifford Heath, Feb 15, 2008.

  1. So I wanted to allow folk using my DSL to say "0..N",
    "1..N", etc, to describe the cardinality of a relationship,
    and I needed to find a useful way to define N without
    making it a fixed integer maximum value.

    Well, I came up with this, which I thought was cute:

    class N
    def self.coerce(n)
    [ n, n+1 ] # Anything you can do, I can do better
    end
    end

    Now when I ask (0..N) === m, for any m, it says "true",
    and when I say the following, it never ends:

    (0..N).each do |n|
    puts n
    end

    But more importantly, I can say:

    do_something if range.last == N

    Ruby is sweeet :).

    Clifford Heath.
     
    Clifford Heath, Feb 15, 2008
    #1
    1. Advertising

  2. Clifford Heath wrote:
    > So I wanted to allow folk using my DSL to say "0..N",
    > "1..N", etc, to describe the cardinality of a relationship,
    > and I needed to find a useful way to define N without
    > making it a fixed integer maximum value.
    >
    > Well, I came up with this, which I thought was cute:
    >
    > class N
    > def self.coerce(n)
    > [ n, n+1 ] # Anything you can do, I can do better
    > end
    > end
    >
    > Now when I ask (0..N) === m, for any m, it says "true",
    > and when I say the following, it never ends:
    >
    > (0..N).each do |n|
    > puts n
    > end
    >
    > But more importantly, I can say:
    >
    > do_something if range.last == N
    >
    > Ruby is sweeet :).


    Does that do anything that Infinity doesn't do?

    irb(main):001:0> Infinity = 1/0.0
    => Infinity
    irb(main):002:0> (0..Infinity) === 3
    => true
    irb(main):003:0> (0..Infinity) === -1
    => false
    irb(main):004:0> (0..Infinity).each do |n|
    irb(main):005:1* p n
    irb(main):006:1> break if n > 3
    irb(main):007:1> end
    0
    1
    2
    3
    4
    => nil
    irb(main):008:0> puts "do_something" if (0..Infinity).last == Infinity
    do_something
    => nil


    Also, there's this....

    class N
    def self.coerce(n)
    [ n, n+1 ]
    end
    end

    x = 3 + N
    p x # ==> 7 w.t.f.?

    Infinity = 1/0.0
    x = 3 + Infinity
    p x # ==> Infinity

    --
    vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407
     
    Joel VanderWerf, Feb 15, 2008
    #2
    1. Advertising

  3. Joel VanderWerf wrote:
    > Does that do anything that Infinity doesn't do?


    Hey, I forgot about Infinity, much better idea,
    and you get -Infinity too :). But this does do
    one thing that Infinity doesn't: it works correctly
    with Bignums that are too big to be coerced to a
    float. I don't think that should concern me though :).

    Is there a standard place where Infinity is defined,
    or should I risk re-defining it? Or worse, test and
    define only if needed...

    Clifford Heath.
     
    Clifford Heath, Feb 15, 2008
    #3
  4. On 15.02.2008 07:34, Clifford Heath wrote:
    > Joel VanderWerf wrote:
    >> Does that do anything that Infinity doesn't do?

    >
    > Hey, I forgot about Infinity, much better idea,
    > and you get -Infinity too :). But this does do
    > one thing that Infinity doesn't: it works correctly
    > with Bignums that are too big to be coerced to a
    > float. I don't think that should concern me though :).
    >
    > Is there a standard place where Infinity is defined,
    > or should I risk re-defining it? Or worse, test and
    > define only if needed...


    Why define or redefine? Why not just

    irb(main):001:0> N = 1/0.0
    => Infinity
    irb(main):002:0> (1..N) === 2
    => true
    irb(main):003:0> (1..N) === -2
    => false

    etc? I believe this is what Joel wanted to suggest.

    Kind regards

    robert
     
    Robert Klemme, Feb 15, 2008
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Talimore
    Replies:
    4
    Views:
    569
    T. Audry Glamour
    Jul 18, 2004
  2. Charles Banas

    multidimensional arrays and cute tricks

    Charles Banas, Jan 21, 2004, in forum: C Programming
    Replies:
    9
    Views:
    401
    Dave Thompson
    Feb 2, 2004
  3. Heiko =?ISO-8859-15?Q?K=F6hler?=

    ANN: scintilla based, scriptable code editor CUTE 0.1.6 released

    Heiko =?ISO-8859-15?Q?K=F6hler?=, Jul 27, 2003, in forum: Python
    Replies:
    0
    Views:
    375
    Heiko =?ISO-8859-15?Q?K=F6hler?=
    Jul 27, 2003
  4. Heiko =?ISO-8859-15?Q?K=F6hler?=

    CUTE 0.2 released

    Heiko =?ISO-8859-15?Q?K=F6hler?=, Sep 12, 2003, in forum: Python
    Replies:
    0
    Views:
    325
    Heiko =?ISO-8859-15?Q?K=F6hler?=
    Sep 12, 2003
  5. Simon Forman

    cute use of lambda

    Simon Forman, Sep 28, 2007, in forum: Python
    Replies:
    3
    Views:
    304
    Kay Schluehr
    Sep 29, 2007
Loading...

Share This Page