On Feb 8, 6:03 pm, Marcin Raczkowski <mailing... / gmail.com> wrote:
> Hello i remeber someone asking fif it's possible in Ruby - and i have no
> idea if it was replyied, anyway i wanted to share my idea how to make
> your own if/else/elsif :)
>
> class Object
>    def else
>      self
>    end
>
>    def elsif(condition,&block)
>      self
>    end
>
>    def if(condition,&block)
>      (!condition && Else) || (condition && block.call)
>    end
> end
>
> class Else
>    def self.else(&block)
>      block.call
>    end
>
>    def self.elsif(condition, &block)
>      self.if(condition, &block)
>    end
> end
>
> and now we can do:
>
> irb(main):024:0> self.if(true){:true}.else{:false}
> => :true
> irb(main):025:0> self.if(false){:true}.else{:false}
> => :false
> irb(main):051:0> self.if(false){:true}.elsif(true){:true}.else{nil}
> => :true
> irb(main):052:0> self.if(false){:true}.elsif(false){:true}.else{nil}
> => nil
> irb(main):053:0> self.if(true){:ok}.elsif(true){:not_ok}.else{:not_ok}
> => :ok
> irb(main):056:0> self.if(false){:not_ok}.elsif(true){:ok}.else{:not_ok}
> => :ok
>
> this aproach is elegant becouse even if object have method else or elif
> or even if declared then it'll bahave as expected !!!
> Also i didn't use any of old if/else statements, i didn't even use tri
> argument operator (cond ? true : false), it's all implemented using
> boolean logic!!
>
> Ok, now probably comes question - what we can do with it - of course -
> create less boolean logic!!!
>
> module Fuzzy
>    def self.if(float, &block)
>      condition = rand <= float
>      (!condition && Else) || (condition && block.call)
>    end
> end
>
> now we provide if function with float between 0 and 1 - which represents
> probability of achieveing goal
>
> Fuzzy.if(0.99){puts "pretty standard stuff"}.else{puts "fuck man, you
> really have luck"}
>
> with some luck (3th try for me) you can get something like this:
> irb(main):097:0> 10.times{ Fuzzy.if(0.99){puts "pretty standard
> stuff"}.else{puts "fuck man, you really have luck"} }
> pretty standard stuff
> pretty standard stuff
> pretty standard stuff
> pretty standard stuff
> fuck man, you really have luck
> pretty standard stuff
> pretty standard stuff
> pretty standard stuff
> pretty standard stuff
> pretty standard stuff
> => 10
>
> What else - of course this way you can do random mutations in genetic
> algorithms, of course there's other ways to achieve that - but this one
> is fun :D
>
> currently there's only one problem with this:
>
> irb(main):099:0>  self.if(false){:not_ok}
> => Else

I bet you could fix that with lazy evaluation.

T.