# Work Sessions November 18th to 22nd, 2024

## Agenda

* Review maintenance CRs and migrate them to GitLab.
* Review questionnaires and discuss potential work items for the new major
  release.

## Discussions

### Structure of core language and extension documents

**Core Language**

We discussed reducing the size of the TTCN-3 core language by:

* moving predefined functions, useful types and such into some kind of standard
  library document.
* Removing or deprecating features that could be substituted by other features
  (e.g. arrays).
* Moving features that are not used by the majority of users, but are
  complementing the language into extension documents (e.g. procedure based
  communication).
* Introducing new language concepts, that simplify the language (e.g. advanced
  parameterization, closures, ...).


**Extensions**

Further we discussed how to reorganize language extensions into smaller
self-contained features and whether to aggregate them into a single language
extension document.

**Backward Compatibility**

The question how to handle backward compatibility was not discussed in detail.
A combination of various strategies is probable:
* Redefine features as short-hand notation.
* Make features optional by moving them to extensions.
* Deprecate features.
* Break compatibility and rely on existing language tags.
* Provide tool for automatic conversion.

### Coding style

We should extend the ruleset for coding style of TTCN-3 examples (and conformance tests).

### Templates

Refining templates pose a big challenge for backward compatibility, but also
many opportunities for simplification. We discussed several ideas without going
too much into detail during this session:

#### Template Evaluation

Various evaluation strategies for templates are required. However, the current
approach of lazy, fuzzy, var, const or parameterized templates is neither
intuitive nor well understood. Examples:

```ttcn3
function f(inout integer i) return integer {
    var integer j := i;
    i++;
    return j;
}

control {
    var integer i := 0;
    var integer a := f(i);
    var integer b := f(i);

    log(a, b, i); // 0, 1, 2

    template Point t(integer p) := {
        x := a,       // eager evaluation (during definition)
        y := f(i),    // eager evaluation (during definition)
        z := p + f(i) // deferred evaluation (during invocation)
    };

    log(t(b), i); // {x := 0, y := 2, z := 4}, 4
}
```

Different evaluation strategies could be modeled with help of new language
features. For example lazy evaluation of previous template could be achieved by
using closures:

```ttcn3
template Point t := function (integer p) return Point {
    x := a,
    y := f(i),
    z := p + f(i),
};
```

Details need to be worked out in future discussions.


#### Special Template Symbols

`all from`, `permutation`, `complement`, `subset`, `superset`, ..., do not need
to be part of the core language. They could be implemented as library
functions, as language extensions or even by user-defined dynamic matching.


#### Inline Templates

Inline templates consist of an optional type annotation part and a template literal.
A dedicated notion for inline templates is not necessary, as they type
annotations could be promoted to a type-conversion operator and template
literals are already part of the language.


#### Modified Templates

Modified template and modified inline template syntax might be unified and simplified.


#### List Templates

See [List Types](#list-types).


#### Differentiation of Values and template values

Differencing between value and template value complicates the language and its specification.

One simplification is to extend the type system to handle templates as proper type.
Example:

```ttcn3
var template integer i := 1;
```

`i` is a variable of type `template integer`. This type could be a variant-type of `integer` and matching symbols.

Another simplification is to remove the differentiation between values and
templates all together. For example: `var integer i := 1` would a shorthand for
`var template(value) integer i := 1`.  
This could also improve on compiler-pleasing through `valueof` and on
operations such as `omit`, `present`, ...


### Type System

We discussed several aspects of the type system to identify opportunities for
simplification:

* Substitute `anytype` with `any`. Type switch from OOP extension would be a
  good addition.
* Arrays
  * remove custom indexing.
  * should become short-hand notation.
* `set` and `set of` should be reviewed (compatibility with records,
  replacement possible?)
* Should automatic typing be extended to unions and generics or should it
  rather be moved to an extension?
* Map type:
  * Could be harmonized with `HashMap` from OOP extension.
  * One could find overlap of `unmap` operations confusing.
  * Some corner cases need clarification (e.g. `h[*] := {}`).
* Sections describing type system could be simplified by introducing better
  type terminolgy (subtyping, type-alias, equality, assignment, component
  variables, ...).


#### List Types

Semantics of list types need harmonization and simplification.

**`lengthof`**

```ttcn3
lengthof('12*'H)  // 3
lengthof({1,2,?}) // 3
lengthof({1,2,*}) // causes runtime error

// Templates cannot be iterated or modified safely
var template record of integer c := {1,2,*};
c[lengthof(c)] := 5; // lengthof causes error
```


**uninitialized elements**

```ttcn3
control {
    var record of integer a := {1,2,_}, b := {1,2,_,_};
    log(equal(a, b)); // true
    log(a==b);        // implementation dependent (false)
}

function equal(record of integer a, record of integer b) return boolean {
    if (lengthof(a) != lengthof(b)) {
        return false;
    }
    for i := 0 to lengthof(a) {
        if (a[i] != b[i]) {
            return false;
        }
    }
    return true
}
```

```ttcn3
var record of integer a := {1,9};
a := {_,2,_} // how many elements will `a` have; 2 or 3?
             // Is d equal to {1,2} or to {1,2,_}?
```

```ttcn3
var record of integer a := {1,2};
a[4] := 5;
log(a); // {1,2,_,_,5}

var charstring b := '12';
b[4] := 5; // causes runtime error

var record of integer c := {1,2,_}; // lengthof(c) == 3
c := c & {3,4};                     // lengthof(c) == ?

```


### Language Features

Procedure based communication might be moved to an extension document.

Some port control operations might be moved to an extension document or even be
removed. Further discussion is needed.

`checkstate` is used to wait for a port to be ready. Further discussion is
needed, whether `checkstate` could be improved or even removed.

The `receive` part of `check` operation could be removed probably.

The `trigger` could be substituted by `check`.

Decoded field references, `decmatch`, `@decode` could be simplified. It needs to be checked whether `=>` can be removed.

We discussed whether `goto` could be removed or substituted by named loops.

Component's `call` operation might be moved into an extension document.

External actions (`action`) do not need to be part of the core language.

Modifiers (pe.g. `@deterministic`, `@nocase`, `@nodefault`, ...) or often overlooked. Further discussion is needed whether there's opportunity to generalize them.

Attributes might be simplified:
  * remove `display`
  * move reading and writing attributes to extension
  * multiple encodings is complicated and could be removed


### Module organization

`import` will be simplified if possible.  
This would make `group` superfluous. However groups are used to structure
modules and groups are also used by some language mappings.  
Simplifying import would further require to discuss importing of imports.

Visibility features (`friend`, `private`, `protected`) are used by testers,
seldom. It's used primarily by framework developers. Possible improvements need
further discussion.


### TCI/TRI/xTRI

Might be merged into a single document. Language mappings for C and Java will
become non-normative, the other language mappings will be removed.

The future for mappings of XML to TLI needs further discussion.

### Extensions

Language features that were neither removed nor moved into the core, will
probably be merged into a common extensions document.

* Performance and real-time extension:
  * `wait` --> core
  * `timestamp` --> core
  * remaining features --> extension
* Configuration and Deployment features mostly stay as they are.
* Advanced parameterisation:
  * Type parameterisation: Could use some refinement (automatic type interence,
    parametric type inference, generic types in ports, ...).
  * Value parameterisation of types: Could be removed.
* Behaviour types:
  * Behaviour types (and closures) will probably move to core to help
    simplification.
  * Deferred behaviour will be removed.
* Continuous signals will probably go to historic state
* Advanced matching:
  * Dynamic matching will probably move to core.
  * Other features need further discussion.
* Object oriented features:
  * Exception-feature will probably move to core
  * Some type operations (`=>`, `select class`) probably, too
  * If and in what form user defined object will be merged into core is not
    clear yet.
