class Pione::Lang::ParamDeclaration

ParamDeclaration is a declaration thae the parameter is neeeded.

Public Instance Methods

eval(env) click to toggle source

Add the parameter in current rule definition.

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

  # we don't permit to declare parameters of other packages
  if not(var.package_id.nil?) and var.package_id != env.current_package_id
    raise ParamDeclarationError.new(self)
  end

  # get the value(don't evaluate in this time)
  default_val = expr2

  begin
    env.variable_get(var)
  rescue UnboundError
    # bind default value
    env.variable_set(var, default_val)
  end

  param = ParameterDefinition.new(type, var.name, default_val)

  # select target definition
  definition = nil
  if env.current_definition
    # in rule definition context
    definition = env.current_definition
  else
    # in package context
    definition = env.package_get(PackageExpr.new(package_id: var.package_id))
  end

  if definition.param_definition[var.name]
    raise RebindError.new(var)
  else
    definition.param_definition[var.name] = param
  end
end
set_type(new_type) click to toggle source
# File lib/pione/lang/declaration.rb, line 126
def set_type(new_type)
  set(type: new_type)
end