Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| language:impl [2022/05/13 12:40] – rajit | language:impl [2026/08/05 15:30] (current) – [Variant overrides] rajit | ||
|---|---|---|---|
| Line 245: | Line 245: | ||
| representation of the Boolean variable. | representation of the Boolean variable. | ||
| + | === Overriding conditional instances and templated types === | ||
| + | An instance created in a type definition may be created only under certain circumstances. | ||
| + | This can occur in templated types, where template parameters can affect the instances within the type. | ||
| + | The override block has the simple syntax shown above. However, to account for conditional instances, | ||
| + | the override block directives implicitly check if the instance exists before applying the override. (Note that | ||
| + | ACT does not permit different types for the same instance name under different conditions.) | ||
| + | When a type is being overridden by another, the new implementation may have additional template parameters. | ||
| + | The override syntax above requires the complete list of template parameters to be specified. Instead, we also | ||
| + | provide a single extension override syntax | ||
| + | |||
| + | <code act> | ||
| + | +{ | ||
| + | type< | ||
| + | ... | ||
| + | } | ||
| + | </ | ||
| + | The '' | ||
| + | |||
| + | |||
| + | ==== Variant overrides ==== | ||
| + | |||
| + | If a process has non-strict template parameters, then variants of the process with different non-strict parameter values may need different overrides. While this is straightforward for simple instances, if an array contains a collection of process variants, then this creates a challenge in declaring an override. | ||
| + | |||
| + | To support this, consider the process below: | ||
| + | <code act> | ||
| + | template< | ||
| + | defproc addbuf(chan? | ||
| + | { | ||
| + | | ||
| + | chp { | ||
| + | *[ L?x; R!(x+VAL) ] | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | If we have different implementations of '' | ||
| + | <code act> | ||
| + | defproc impl_addbuf <: addbuf() | ||
| + | +{ | ||
| + | ... any overrides for ports here ... | ||
| + | } | ||
| + | { | ||
| + | /* the default implementation */ | ||
| + | ... | ||
| + | } | ||
| + | | addbuf< | ||
| + | /* different implementation when the non-strict parameter has value 4 */ | ||
| + | } | ||
| + | | addbuf< | ||
| + | /* different implementation when the non-strict parameter has value 8 */ | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | This variant override syntax permits variations of the implementation relation based on the specific values of the non-strict template parameters. | ||