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