module Pairs

Constants

VERSION

Public Class Methods

car(pair) click to toggle source
# File lib/pairs.rb, line 21
def self.car(pair)
  check_pair(pair)
  pair.call('car')
end
cdr(pair) click to toggle source
# File lib/pairs.rb, line 26
def self.cdr(pair)
  pair.call('cdr')
end
check_pair(pair) click to toggle source
# File lib/pairs.rb, line 15
def self.check_pair(pair)
  return if pair?(pair)

  raise NoMethodError, pair.to_s
end
cons(left, right) click to toggle source
# File lib/pairs.rb, line 2
def self.cons(left, right)
  lambda { |message|
    case message
    when 'car'
      left
    when 'cdr'
      right
    else
      raise "Unknown message #{message}"
    end
  }
end
pair?(pair) click to toggle source
# File lib/pairs.rb, line 30
def self.pair?(pair)
  pair.instance_of? Proc
end
to_string(pair) click to toggle source
# File lib/pairs.rb, line 34
def self.to_string(pair)
  rec = lambda { |pair_inner|
    return pair_inner.to_s unless pair?(pair_inner)

    left = car(pair_inner)
    right = cdr(pair_inner)
    "(#{rec.call(left)}, #{rec.call(right)})"
  }

  rec.call(pair)
end