Forum: Ruby Overwriting "if"

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
E60b2dc57668b5662ce3f07781e41710?d=identicon&s=25 Matthew Rudy Jacobs (matthewrudy)
on 2007-07-19 11:14
I want to overwrite if,
but it doesn't seem to work.

module Kernel
  def if(arg)
    yield
  end
end

def if(arg)
  yield
end

doesn't seem to work.
I know I could define my own if,
but it seems like ruby, being so dynamic, should be capable of this.

Any amusing suggestions on how to implement this will be much welcomed.

MatthewRudy
0158871402c1ecfa57952e8a379cfd10?d=identicon&s=25 Daniel Lucraft (lucraft)
on 2007-07-19 11:29
Matthew Rudy wrote:
> I want to overwrite if,
> Any amusing suggestions on how to implement this will be much welcomed.
>
> MatthewRudy

Be like Smalltalk!

irb> class Object
irb>  def if
irb>   if self
irb>    yield
irb>   end
irb>  end
irb> end
=> nil

irb> (4==4).if { p :true }
:true
=> nil
irb> (4==6).if { p :true }
=> nil

irb> class Object
irb>  def if(blocks)
irb>   if self
irb>    blocks[:then].call
irb>   else
irb*    blocks[:else].call
irb>   end
irb>  end
irb> end
=> nil

irb> (4==4).if :then => lambda { p :true }, :else => lambda { p :false }
:true
=> nil
irb> (4==6).if :then => lambda { p :true }, :else => lambda { p :false }
:false
=> nil
irb>


Be like Arc!!

irb> alias fn lambda
=> nil
irb> (4==6).if :then => fn { p :true }, :else => fn { p :false }
:false
=> nil
E60b2dc57668b5662ce3f07781e41710?d=identicon&s=25 Matthew Rudy Jacobs (matthewrudy)
on 2007-07-19 11:34
that's cool,
but can we not redefine the default "if"
so that the following code will work

if false
  return "false is true"
end

without resorting to calling a method on a class / instance / module
explicitly

I'm thinking that intead we can overwrite the evaluation of False and
NilClass
?


Daniel Lucraft wrote:

> Be like Smalltalk!

> irb> (4==4).if { p :true }
> :true
> => nil
> irb> (4==6).if { p :true }
> => nil

> irb> (4==4).if :then => lambda { p :true }, :else => lambda { p :false }
> :true
> => nil
> irb> (4==6).if :then => lambda { p :true }, :else => lambda { p :false }
> :false
> => nil
> irb>

> irb> (4==6).if :then => fn { p :true }, :else => fn { p :false }
> :false
> => nil
0158871402c1ecfa57952e8a379cfd10?d=identicon&s=25 Daniel Lucraft (lucraft)
on 2007-07-19 11:46
Matthew Rudy wrote:
> that's cool,
> but can we not redefine the default "if"

Don't think so: 'if' is a keyword. You'll never get it to look for a
method called 'if' without rewriting the interpreter.

> if false
>   return "false is true"
> end

Is there a reason for all this or are you just amusing yourself? :-)

Dan
E60b2dc57668b5662ce3f07781e41710?d=identicon&s=25 Matthew Rudy Jacobs (matthewrudy)
on 2007-07-19 11:49
just for fun
:)

if only keywords could be overwritten.
I guess I could just rebuild the parser.

anyway,
thanks for your suggestions,
back to work

Mj

Daniel Lucraft wrote:
> Matthew Rudy wrote:
>> that's cool,
>> but can we not redefine the default "if"
>
> Don't think so: 'if' is a keyword. You'll never get it to look for a
> method called 'if' without rewriting the interpreter.
>
>> if false
>>   return "false is true"
>> end
>
> Is there a reason for all this or are you just amusing yourself? :-)
>
> Dan
C667185722eaecf12461cb423dc8b410?d=identicon&s=25 Ronald Fischer (Guest)
on 2007-07-19 11:51
(Received via mailing list)
>   yield
> end
>
> doesn't seem to work.
> I know I could define my own if,
> but it seems like ruby, being so dynamic, should be capable of this.

Of course this is something we really need in Ruby ;-)

This reminds me on the following, valid (and at its time popular),
PL/1 code:

  IF IF=THEN
  THEN THEN=ELSE
  ELSE ELSE=IF;

Ronald
This topic is locked and can not be replied to.