module ValueFinder

Value finder module

Public Instance Methods

find_all_values(other) click to toggle source
# File lib/lisp/interpreter/helpers/value_finder.rb, line 3
def find_all_values(other)
  result = []
  until other.empty?
    x, other = find_next_value other
    result << x
  end
  result
end
find_bracket_idx(other, first_bracket) click to toggle source
# File lib/lisp/interpreter/helpers/value_finder.rb, line 12
def find_bracket_idx(other, first_bracket)
  open_br = 0
  other[first_bracket..other.size - 1].each_with_index do |token, idx|
    open_br += 1 if token == '('
    open_br -= 1 if token == ')'
    return idx + first_bracket if open_br.zero?
  end
end
find_list_value(other) click to toggle source
# File lib/lisp/interpreter/helpers/value_finder.rb, line 33
def find_list_value(other)
  value = no_eval_list other[2..(find_bracket_idx other, 1) - 1]
  [(build_list value), other[3 + (size_for_list_elem value)..-1]]
end
find_next_raw_value(other) click to toggle source
# File lib/lisp/interpreter/helpers/value_finder.rb, line 38
def find_next_raw_value(other)
  [(get_var other[0].to_s), other[1..-1]]
end
find_next_value(other) click to toggle source
# File lib/lisp/interpreter/helpers/value_finder.rb, line 53
def find_next_value(other)
  return [other[0], other[1..-1]] if other[0].is_a? Proc
  match_inf = other[0].to_s.match(/c[ad]{2,}r/)
  return [(generate_infinite_car_cdr other[0]), other[1..-1]] if match_inf
  find_value_helper other
end
find_value_helper(other) click to toggle source
# File lib/lisp/interpreter/helpers/value_finder.rb, line 42
def find_value_helper(other)
  if other[0] == '('
    idx = find_idx_for_list other
    [(calc_input_val other[0..idx]), other[idx + 1..-1]]
  elsif other[0..1].join == '\'('
    find_list_value other
  else
    find_next_raw_value other
  end
end
get_raw_value(token) click to toggle source
# File lib/lisp/interpreter/helpers/value_finder.rb, line 77
def get_raw_value(token)
  if token.pair? || token.list?
    build_list no_eval_list token[2..-2]
  else
    return if token.empty?
    token = token.join('') if token.is_a? Array
    return (generate_infinite_car_cdr token) if token =~ /c[ad]{2,}r/
    get_var token.to_s
  end
end
get_var(var) click to toggle source
# File lib/lisp/interpreter/helpers/value_finder.rb, line 67
def get_var(var)
  check = check_instance_var var
  return @procs[var.to_s] if check
  val = (predefined_method_caller [var])
  return val unless val.nil?
  valid = valid_var var
  var = var.to_num.to_s if check_for_num var
  valid ? var : (raise unbound_symbol_err var)
end
set_var(var, value) click to toggle source
# File lib/lisp/interpreter/helpers/value_finder.rb, line 60
def set_var(var, value)
  valid = (valid_var value.to_s) || (value.is_a? Proc)
  raise 'Invalid parameter' unless valid || (value.is_a? Symbol)
  return if var == value.to_s
  @procs[var] = value
end
size_for_list_elem(values) click to toggle source
# File lib/lisp/interpreter/helpers/value_finder.rb, line 21
def size_for_list_elem(values)
  result = []
  values.each do |v|
    if v.include?('(') || v.include?(')')
      v.split(/(\(|\))|\ /).each { |t| result << t unless t == '' }
    else
      result << v
    end
  end
  result.size
end