[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Aliasing return false

Ari Brown

9/26/2007 11:09:00 PM

Hey all,

I'm writing a quick DSL, and in it, I end up having to use return
false unless {} quite a bunch.

Since I still need everything outside of the return false's, Stefan
<apeiros>'s Stepper code is of no use, although it is still quite
awesome.

Is there a way to alias it from, say:

return false unless { klass.method? }

to:

rule { klass.method? }

Thanks,
Ari
--------------------------------------------|
If you're not living on the edge,
then you're just wasting space.



5 Answers

Logan Capaldo

9/26/2007 11:24:00 PM

0

On 9/26/07, Ari Brown <ari@aribrown.com> wrote:
> Hey all,
>
> I'm writing a quick DSL, and in it, I end up having to use return
> false unless {} quite a bunch.
>
> Since I still need everything outside of the return false's, Stefan
> <apeiros>'s Stepper code is of no use, although it is still quite
> awesome.
>
> Is there a way to alias it from, say:
>
> return false unless { klass.method? }
>
> to:
>
> rule { klass.method? }
>

this is evil

% cat rule.rb
def rule(&b)
r = b.call
eval("return false", b) unless r
end

def a
rule { false }
0
end

def b
rule { true }
1
end

p a
p b

% ruby rule.rb
false
1

Ari Brown

9/26/2007 11:41:00 PM

0


On Sep 26, 2007, at 7:24 PM, Logan Capaldo wrote:

> this is evil

Because it uses eval?

>
> % cat rule.rb
> def rule(&b)
> r = b.call
> eval("return false", b) unless r
> end
>
> def a
> rule { false }
> 0
> end
>
> def b
> rule { true }
> 1
> end
>
> p a
> p b
>
> % ruby rule.rb
> false
> 1

Damn you, evil geniuses! Damn you!

I can't believe I didn't think of this. This is why you win and I don't.

Thanks ridonculously,
Ari
-------------------------------------------|
Nietzsche is my copilot



Logan Capaldo

9/26/2007 11:52:00 PM

0

On 9/26/07, Ari Brown <ari@aribrown.com> wrote:
>
> On Sep 26, 2007, at 7:24 PM, Logan Capaldo wrote:
>
> > this is evil
>
> Because it uses eval?
>
Because it uses eval and assumes that returning from an activation
frame below the one we are in will do the right thing. I don't know
for instance, how this behaves in the presence of things like ensure
blocks, etc.
> >
> > % cat rule.rb
> > def rule(&b)
> > r = b.call
> > eval("return false", b) unless r
> > end
> >
> > def a
> > rule { false }
> > 0
> > end
> >
> > def b
> > rule { true }
> > 1
> > end
> >
> > p a
> > p b
> >
> > % ruby rule.rb
> > false
> > 1
>
> Damn you, evil geniuses! Damn you!
>
> I can't believe I didn't think of this. This is why you win and I don't.
>
> Thanks ridonculously,
> Ari
> -------------------------------------------|
> Nietzsche is my copilot
>
>
>
>

Joel VanderWerf

9/27/2007 1:39:00 AM

0

Ari Brown wrote:
> Hey all,
>
> I'm writing a quick DSL, and in it, I end up having to use return false
> unless {} quite a bunch.
>
> Since I still need everything outside of the return false's, Stefan
> <apeiros>'s Stepper code is of no use, although it is still quite awesome.
>
> Is there a way to alias it from, say:
>
> return false unless { klass.method? }
>
> to:
>
> rule { klass.method? }


class RuleException < Exception; end

def rules
yield
rescue RuleException
end

def rule(&b)
raise RuleException unless yield
end

rules do
p 1
rule {true}
p 2
rule {false}
p 3
end

__END__

Output:

1
2

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Joel VanderWerf

9/27/2007 1:59:00 AM

0

Joel VanderWerf wrote:
> Ari Brown wrote:
>> Hey all,
>>
>> I'm writing a quick DSL, and in it, I end up having to use return
>> false unless {} quite a bunch.
>>
>> Since I still need everything outside of the return false's, Stefan
>> <apeiros>'s Stepper code is of no use, although it is still quite
>> awesome.
>>
>> Is there a way to alias it from, say:
>>
>> return false unless { klass.method? }
>>
>> to:
>>
>> rule { klass.method? }

Ignore previous post, it didn't really explain how you would have to use
this construct:

class RuleException < Exception; end

def rules
yield
rescue RuleException
false # be explicit and return false instead of nil
end

def rule(&b)
raise RuleException unless yield
end

def some_method(arg)
rules do
rule {/foo/ !~ arg}
rule {/bar/ !~ arg}
true # could move this line after the "yield"
end
end

p some_method("aaaa")
p some_method("bar")

__END__

Output:

true
false

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407