Skip to content

Instantly share code, notes, and snippets.

@jcinnamond
Created April 2, 2015 09:03
Show Gist options
  • Select an option

  • Save jcinnamond/bcbf4ab7c07ff34c8d50 to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown
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
Copy Markdown
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