Sha256: 4cb45483f954f0b7ce4097065a55451b652ab98ed625573be1df422e4ef15c50

Contents?: true

Size: 1.2 KB

Versions: 1

Compression:

Stored size: 1.2 KB

Contents

require 'gobstones/lang/definitions/definition'
require 'gobstones/lang/definitions/no_return_statement'
require 'gobstones/runner/execution_context'
require 'gobstones/runner/errors/wrong_arguments_error'

module Gobstones

  module Lang

    class Procedure < Definition

      # TODO rename args to a better name, args_tuple?

      def initialize(name, args, body)
        super(name, args, body, NoReturnStatement.new)
      end

      def evaluate(context, arguments=[])
        check_number_of_arguments arguments
        procedure_context = Gobstones::Runner::ProcedureExecutionContext.based_on context
        set_arguments arguments, procedure_context
        body.evaluate procedure_context
      end

      private

      def check_number_of_arguments(arguments)
        if args.length != arguments.length
          message = "Wrong number of arguments in procedure '#{name}': expected #{args.length}, got #{arguments.length}"
          raise Gobstones::Runner::WrongArgumentsError, message
        end
      end

      def set_arguments(arguments, procedure_context)
        args.length.times do |index|
          procedure_context.set args.variables[index], arguments[index]
        end
      end

    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
gobstones-0.0.1.1 lib/gobstones/lang/definitions/procedure.rb