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