Aliasing return false

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
'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.

On 9/26/07, Ari B. [email protected] wrote:

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

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

this is evil

Because it uses eval?

end
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

On 9/26/07, Ari B. [email protected] wrote:

On Sep 26, 2007, at 7:24 PM, Logan C. 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.

Ari B. wrote:

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

Joel VanderWerf wrote:

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