Aliasing return false

A

Ari Brown

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

Logan Capaldo

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
 
A

Ari Brown

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
 
L

Logan Capaldo

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

Joel VanderWerf

Ari said:
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
 
J

Joel VanderWerf

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads

Learning the fine points of Ruby 5
Custom Packets 10
ActiveRecord without Rails 4
Detecting Arrow Keys 4
Ruby Plugins 3
[Solution][QUIZ] #67 metakoans.rb 0
Railless ActiveRecord 16
Hiding user input 9

Members online

Forum statistics

Threads
474,264
Messages
2,571,324
Members
48,009
Latest member
KobyH55844

Latest Threads

Top