Skip to content

Instantly share code, notes, and snippets.

@jcinnamond
Created April 2, 2015 09:03
Show Gist options
  • Save jcinnamond/bcbf4ab7c07ff34c8d50 to your computer and use it in GitHub Desktop.
Save jcinnamond/bcbf4ab7c07ff34c8d50 to your computer and use it in GitHub Desktop.
class Zero
def pred
self
end
def succ
Number.new(self)
end
def +(other)
other
end
def to_s
""
end
def inspect
"Zero"
end
end
class Number
attr_reader :pred
def initialize(pred = NotANumber.new)
@pred = pred
end
def succ
Number.new(self)
end
def +(other)
Number.new(pred + Number.new(other.pred))
end
def to_s
"." + @pred.to_s
end
def inspect
"<Number #{to_s} @pred=#{@pred.inspect}>"
end
end
@jcinnamond
Copy link
Author

irb(main):074:0> zero = Zero.new
=> Zero
irb(main):075:0> one = zero.succ
=> <Number . @pred=Zero>
irb(main):076:0> one + one
=> <Number .. @pred=<Number . @pred=Zero>>
irb(main):077:0> two = one.succ
=> <Number .. @pred=<Number . @pred=Zero>>
irb(main):078:0> two + one
=> <Number ... @pred=<Number .. @pred=<Number . @pred=Zero>>>
irb(main):079:0> two + two
=> <Number .... @pred=<Number ... @pred=<Number .. @pred=<Number . @pred=Zero>>>>
irb(main):080:0> zero + two
=> <Number .. @pred=<Number . @pred=Zero>>

@jcinnamond
Copy link
Author

Weird unnecessary complexity. There is no need to use Number.new(other.pred) in the addition as that is identical to other. The definition of plus should simply be:

  def +(other)
    Number.new(pred + other)
  end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment