A complex statement is how you would create something like the FOR statement in BASIC. In fact, ASIL’s FOR is described below in the sample code. The keyword instructions is how you specify where to run the code that was passed. instructions can take a comma delimited list of variables known to the statement being declared. So “
instructions a, b, c” will allow the code being called with the instructions statement to reference a, b, and c as though they were keywords. Complex statements don’t have a return value. All variables passed to instructions are implicitly treated as constant by the calling code. You don’t need to take into account that the code might modify them. Any variables declared while passing actual parameters go out of scope the moment the complex statement returns. At that point, they might become subject to garbage collection.
You could use ASIL’s statement keyword to declare something like the for keyword in C if you wanted. Complex statements are the only place ASIL allows use of the Goto statement or labels.
Please note the version below is overloaded. Also, the out keyword causes the compiler to require a variable rather than a constant. (The ref by itself would do that as well, but out specifies the function will initialize the variable. ref corresponds to the C# keyword ref while out corresponds to C#’s out.) Formal parameters in complex statement declarations declared as out are the only procedure parameters that allow the caller to declare a variable in the call. See [Scope rules] for more information.
statement For var out Index% \=\ var InitialValue% \To\ var EndingValue% \Step\ var Skip% Index% = InitialValue% if not \Step\ then Skip% = 1 label Loop instructions ' Index% is already visible as it was passed to For. label onnext Index% ++ Skip% If Index% <= EndingValue% Then goto Loop goto End label onbreak label End statement <IndexType> For var out type CurItem \in\ var IIndexable<IndexType> Set var IIndexer<IndexType> indexer = Set.Indexer label Loop label onnext if indexer.isLast then goto end instructions indexer ' CurItem is already accessible as it was passed to For. if not indexer.isLast then indexer.next goto Loop label end label onbreak
The second overload assumes the types shown below.
interface IIndexable<IndexType> property IIndexer<IndexType> Indexer get interface IIndexer<IndexType> property boolean isLast get property boolean hasMore get property IndexType Current get set function next returns IndexType REM Should an IIndexer be bi-directional?
Wiki: Scope rules
Wiki: When is it a procedure, command, function, property, property accessor, method, complex statement, or type cast?