class Basic101::UserDefinedFunction

Public Class Methods

new(identifier, parameters, expression) click to toggle source
# File lib/basic101/user_defined_function.rb, line 9
def initialize(identifier, parameters, expression)
  @identifier = identifier
  @parameters = parameters
  @expression = expression
end

Public Instance Methods

call(runtime, args) click to toggle source
# File lib/basic101/user_defined_function.rb, line 19
def call(runtime, args)
  raise InvalidArgumentError unless args.size == @parameters.size
  save_parameters(runtime)
  bind_arguments(runtime, args)
  result = @expression.eval(runtime)
  restore_parameters(runtime)
  result
end
name() click to toggle source
# File lib/basic101/user_defined_function.rb, line 15
def name
  @identifier.to_s
end

Protected Instance Methods

state() click to toggle source
# File lib/basic101/user_defined_function.rb, line 30
def state
  [@identifier, @parameters, @expression]
end

Private Instance Methods

bind_arguments(runtime, args) click to toggle source
# File lib/basic101/user_defined_function.rb, line 42
def bind_arguments(runtime, args)
  @parameters.zip(args).each do |parameter, arg|
    parameter.assign(runtime, arg.eval(runtime))
  end
end
restore_parameters(runtime) click to toggle source
# File lib/basic101/user_defined_function.rb, line 48
def restore_parameters(runtime)
  @parameters.zip(@original_parameter_values) do |parameter, value|
    parameter.assign(runtime, value)
  end
end
save_parameters(runtime) click to toggle source
# File lib/basic101/user_defined_function.rb, line 36
def save_parameters(runtime)
  @original_parameter_values = @parameters.map do |parameter|
    parameter.eval(runtime)
  end
end