module RubyLisp::Util

Public Instance Methods

assert_arg_type(sexp, arg_number, arg_type) click to toggle source
# File lib/rubylisp/util.rb, line 25
def assert_arg_type sexp, arg_number, arg_type
  fn = sexp[0]
  fn_name = fn.value
  arg = if arg_number == 'last'
          sexp.last
        else
          sexp[arg_number]
        end

  arg_description = if arg_number == 'last'
                      'The last argument'
                    else
                      "Argument ##{arg_number}"
                    end

  arg_types = if arg_type.class == Array
                arg_type
              else
                [arg_type]
              end

  expected = case arg_types.count
             when 1
               arg_types.first
             when 2
               arg_types.join(' or ')
             else
               last_arg_type = arg_types.pop
               arg_types.join(', ') + " or #{last_arg_type}"
             end

  if arg_types.none? {|type| arg.is_a? type}
    raise RuntimeError,
          "#{arg_description} to `#{fn_name}` must be a " +
          "#{expected}; got a #{arg.class}."
  end
end
assert_at_least_n_args(sexp, num_args) click to toggle source
# File lib/rubylisp/util.rb, line 15
def assert_at_least_n_args sexp, num_args
  fn, *args = sexp
  fn_name = fn.value
  unless args.count >= num_args
    raise RuntimeError,
          "Wrong number of arguments passed to `#{fn_name}`; " +
          "got #{args.count}, expected at least #{num_args}."
  end
end
assert_number_of_args(sexp, num_args) click to toggle source
# File lib/rubylisp/util.rb, line 5
def assert_number_of_args sexp, num_args
  fn, *args = sexp
  fn_name = fn.value
  unless args.count == num_args
    raise RuntimeError,
          "Wrong number of arguments passed to `#{fn_name}`; " +
          "got #{args.count}, expected #{num_args}."
  end
end
hash_map(values) click to toggle source
# File lib/rubylisp/types.rb, line 123
def hash_map(values)
  if values.size.odd?
    raise ParseError, "A hash-map must contain an even number of forms."
  else
    Hamster::Hash[values.each_slice(2).to_a]
  end
end
list(values) click to toggle source
# File lib/rubylisp/types.rb, line 135
def list(values)
  values.to_list
end
list?(x) click to toggle source
# File lib/rubylisp/types.rb, line 139
def list?(x)
  x.is_a? Hamster::List
end
map?(x) click to toggle source
# File lib/rubylisp/types.rb, line 131
def map?(x)
  x.is_a? Hamster::Hash
end
sequential?(x) click to toggle source
# File lib/rubylisp/types.rb, line 155
def sequential?(x)
  list?(x) || vector?(x)
end
vec(values) click to toggle source
# File lib/rubylisp/types.rb, line 143
def vec(values)
  Hamster::Vector.new(values)
end
vector(*values) click to toggle source
# File lib/rubylisp/types.rb, line 147
def vector(*values)
  Hamster::Vector.new(values)
end
vector?(x) click to toggle source
# File lib/rubylisp/types.rb, line 151
def vector?(x)
  x.is_a? Hamster::Vector
end