class Campa::Lisp::Cadr

Public Class Methods

new() click to toggle source
# File lib/campa/lisp/cadr.rb, line 4
def initialize
  @printer = Printer.new
  @car = Car.new
  @cdr = Cdr.new
end

Public Instance Methods

call(operation, list) click to toggle source
# File lib/campa/lisp/cadr.rb, line 14
def call(operation, list)
  return nil if list.nil? || list == List::EMPTY
  raise illegal_argument(list) if !list.is_a?(List)

  cut_list(
    list,
    operation
      .label[1..-2]
      .reverse
      .split("")
  )
end
macro?() click to toggle source
# File lib/campa/lisp/cadr.rb, line 10
def macro?
  true
end

Private Instance Methods

cut_list(list, invocation_sequence) click to toggle source
# File lib/campa/lisp/cadr.rb, line 33
def cut_list(list, invocation_sequence)
  invocation_sequence.reduce(list) do |l, oper|
    to_call = oper == "a" ? @car : @cdr
    to_call.call(l)
  end
end
illegal_argument(list) click to toggle source
# File lib/campa/lisp/cadr.rb, line 29
def illegal_argument(list)
  Error::IllegalArgument.new(@printer.call(list), "list")
end