class Pione::Lang::PackageBindingDeclaration

PackageBindingDeclaration is a declaration for package binding sentences.

Public Instance Methods

eval(env) click to toggle source

Update variable table and package table.

# File lib/pione/lang/declaration.rb, line 78
def eval(env)
  # variable name
  var = get_reference(env, expr1, Variable)

  # check the parent package
  parent_package = expr2.eval(env)

  # evaluate expr2 and get new package instance
  child_pieces = parent_package.pieces.map do |parent_piece|
    # definition of parent package
    parent_definition = env.package_get(parent_piece)
    # generate new id
    child_id = Util::PackageID.generate(env, parent_piece.name)
    # validate parameter set
    parent_piece.param.pieces.each do |param_piece|
      param_piece.table.keys do |key|
        unless parent_definition.param_definition.has_key?(key.name)
          raise ParamError.new(key.name, parent_piece.package_id)
        end
      end
    end
    # update package table
    definition = PackageDefinition.new(
      package_id: child_id,
      parent_ids: [parent_piece.package_id],
      param_definition: parent_definition.param_definition,
      param: parent_definition.param.merge(parent_piece.param)
    )
    # create child piece
    child_piece = parent_piece.set(package_id: child_id, parent_ids: [parent_piece.package_id])
    # register the child to package table
    env.package_set(child_piece, definition)
    # result
    child_piece
  end
  child_package = PackageExprSequence.of(*child_pieces)

  # update variable table with the result
  VariableBindingDeclaration.new(var, child_package).eval(env)
end