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