1.19Names
name ::= { id "." } id
Names used in the program consist of one or more identifiers (see above) separated by a dot ("."). They may be either simple or qualified.
Simple names do not contain a dot ("."). Qualified names are those that include a dot (".").
For example, Pressure_2 and Control.Common.Pressure_2 are well-formed names. The form .Pressure_2 is not a name, since the dot (".") must be preceded by an identifier.
Note that qualified names are defined in AsmL at the token level, not the lexical level. This means that white space and comments may appear in between the tokens that constitute a qualified name.
We use the terms name and identifier interchangeably throughout the rest of this reference. The grammar makes it clear when a qualified name may be used instead of a simple name.
1.20Declaration Scope
The scope of a declared name is the region of the program text within which the declared name has meaning.
Unless otherwise noted, the scope of a declared name N is the enclosing scope, that is, the region given by the declaration that contains N’s declaration in nested form. If N’s declaration is not nested within another declaration, it has global scope (that is, it is defined within the namespace Main as we will see later in section 1.59). A name with global scope is called a global name.
1.20.1Unique declarations required per scope
All declared names must be distinct within their scope. For example, an error occurs if a type declaration and a field declaration introduce the same name in the same scope. It is also not allowed to give a field the same name as a method.
There are two exceptions to this rule: overloaded method names and continued declarations.
Overloaded methods are distinguished by their argument types as well as their names. It is therefore possible that two distinct methods will have the same name. See section below.
Continued declarations allow a single declaration to be split into sections. For example, a class declaration may introduce methods in lexically separate blocks. See section below.
Implementation Note
The AsmL compiler currently does not perform a check to prevent a field and a method from having identical names. This will be corrected in a subsequent release.
Names introduced either by declarations nested within a type declaration (assuming the shared keyword is absent) or by statements (see section below) are called locally declared names.
Locally declared names hide global names. For example, names introduced inside of methods for local variables may be the same as global variables. In this case, any references to the name are interpreted using the local definition.
Note that the shadowed names are still available by means of qualified names. See section below for the use of qualified names.
Local names are not allowed to shadow other local names, regardless of nesting level of their respective scopes.
Shadowing the names of types is not allowed.
1.20.3Order unimportant within a scope
The order of declarations in a scope is of no significance. However, there are two exceptions.
First, the order that field declarations occur in class or structure declaration determines the order of the parameters of the default construction expression for that datatype.
Second, the order of elements in an enumeration determines the default numeric values associated with those elements. See section below.
1.20.4Closure of scope
Every scope in a program must be closed. In other words, every simple name referenced within a scope must be a declared name visible in that scope.
1.21Continuation of declarations
AsmL allows a type declaration, namespace or method to be divided into distinct lexical blocks.
In general, a declaration is simply the union of separate lexical blocks. In all cases, the interpretation is "union of constraint." That is, the information provided by all declarations of a given name within the same scope must not contradict.
Implementation note
When a method declaration is continued, only one occurrence of the method may have a body. This is a restriction may be relaxed in future versions of AsmL.
-
Continuation of declarations
class Cell
const id as String
SetValue(i as Integer)
GetValue() as Integer
Main()
step
let c = new Cell("ID1", 42)
step
WriteLine(c.GetValue())
class Cell // continuation of class
var storage as Integer
SetValue(i as Integer) // continuation of method
storage := i
GetValue() as Integer // continuation of method
return storage
1.22 4Values, Constructors and Patterns Values
Values are the immutable, abstract entities that exist during the run of a program.
Evaluating an expression (i.e., a formula) at runtime produces a value. For example, if we evaluate the expression 1 + 3 we get the value 4.
Values comprise the domain of each type. (See section below for information about types.)
The fundamental operations that apply to all values are equality (the "=" operator) and set membership (the "in" operator). We may always query whether two expressions represent the same value and whether a given value is an element of a given set.
Note to users
Values are "elements" in the mathematical sense. That is, they are the abstract entities used as members of mathematical sets.
The notion of a value's "identity" is fundamental. Thus, values are immutable, primitive entities that do not change as the system runs.
Of course, a variable (a named location that contains a value) may be associated with various values as the system's state evolves during the run of the program. When we speak of changing "the value of a variable" it is only the association of variable to value that changes.
Share with your friends: |