x = 1; y = 3
z = x + y
puts z #<= z = 4
Since z depends on x and y, what will happen when we update value of x or y. z remains same as 4 because z is already computed and stored using the values of x and y. Now if the values of x and y changes z will still remain the same.
But what if you want z to get adjusted depending upon x and y. This is more common problem in everyday programming than we think. Imagine you have to update the GUI based on what is changing in underlying model (MVC?) or take an example of spreadsheet where changing a value in a cell recalculates some other cell based on a formula.
Here is a very simple example of Reactive Programming in Ruby using EventTarget.
Here in this example value of z is x + 2. We evaluate z by setting an initial value for x and then later we change value of x and observe the value of z changed as well.
require 'EventTarget'
module Rx
class Change
attr_accessor :old, :new
end
class ObservableValue
include EventTarget
def initialize(value, on_change)
add_event_listener(:change, &on_change)
self.value = value
end
def value=( v )
change = Change.new
change.old = @value
change.new = v
@value = v
evt = Event.new( :change, change )
dispatch_event( evt )
end
end
end
if $0 == __FILE__
z = 0
on_change = Proc.new {|e| z = e.change.new + 2}
x = Rx::ObservableValue.new(3, on_change)
puts "Initial value of z is #{z}" #<= z=5
x.value = 5
puts "Current value of z is #{z}" # <= z=7
end
This is a very simple and contrived example of Reactive programming but I hope this illustrates the point. The concept is way more powerful and is (Functional Reactive Programming) available in a lot of functional languages like Haskell. Take a look at Reactive Framework in .Net and Javascript, Traits, Trellis in Python or Cells in Common Lisp for more understanding of how Reactive Programming works.
Let me know your thoughts and happy hacking :)


