class RbScheme::Primitive::Procedure

Attributes

arg_list[R]
func[R]
name[R]
required_arg_num[R]

Public Class Methods

new(attrs = {}) click to toggle source
# File lib/rb-scheme/primitive/procedure.rb, line 6
def initialize(attrs = {})
  @name = attrs[:name]
  @func = attrs[:func]
  parse_parameter_info(attrs[:func])
end

Public Instance Methods

call(args) click to toggle source
# File lib/rb-scheme/primitive/procedure.rb, line 12
def call(args)
  check_arg_num!(args)
  func.call(*args)
end

Private Instance Methods

check_arg_num!(args) click to toggle source
# File lib/rb-scheme/primitive/procedure.rb, line 32
def check_arg_num!(args)
  if required_arg_num > args.count
    message = arg_list ?
      "primitive procedure #{name}: required at least #{required_arg_num} arguments, got #{args.count}" :
      "primitive procedure #{name}: required #{required_arg_num} arguments, got #{args.count}"
    raise ArgumentError, message
  end
end
parse_parameter_info(fn) click to toggle source
# File lib/rb-scheme/primitive/procedure.rb, line 19
def parse_parameter_info(fn)
  @required_arg_num = 0
  fn.parameters.each do |p|
    param_type = p[0]
    case param_type
    when :req
      @required_arg_num += 1
    when :rest
      @arg_list = true
    end
  end
end