A constant declaration has the form
name: = <ObjectGenerator>
where name is the name of the object and <ObjectGenerator> is an action that generates the object –the ObjectGenerator is executed when the constant is generated as part of the generation of the enclosing object.
A singular object is a constant data-item.
C1: = integer(7)
C2: = 7
C3: = Point(3,4 + y)
C4: = Record
C5: = Person("John Smith",21)
A variable declaration has the form
name: ? <ObjectGenerator> or <PatternName>
where name is the name of the object - name may refer different objects during the lifetime of the enclosing object.
If <ObjectGenerator> then an object is generated as the initial object that name refers.
If <PatternName>, then the initial value is NONE, which refers no object.
V1: ? integer -- or integer(0), integer()??
V2: ? integer(7) -- the initial value of V2 is 7
V3: ? Point(3,4) -- the initial value is an instance of Point(3,4)
V4: ? Record - initial value is none
V5: ? Person -- ditto
A constant declaration like C: = integer(7) may syntactically be confused with an assignment of the form C := exp. We may change the syntax of assignment to:
V <- exp
Until this happen, it is necessary that there is at least one blank between ':' and '=' in a constant declaration.
For unary patterns there is an issue: let Person be a unary pattern:
C: = Person -- C should be a constant reference to an instance of Person,
V: ? Person -- Is V initially none or an instance of Person?
Alternatively we may use #Person to denote the name of a pattern, including #%put%at%, etc - this may also solve how we refer to names using %inner, %restart of %leave. Then
V: ? #Person -- is initially none
V: ? Person -- is initially an instance of Person
Another alternative may be to avoid none references all together - cf Hoare and others - for this to work we must make it easy to define none-like patterns for all patterns.