Branch: Difference between revisions

From APL Wiki
Jump to navigation Jump to search
(Created page with "{{Built-in|Branch|→}} is a primitive monadic function which provides a way to control execution flow in an APL programs. It is equivalent to GOTO...")
 
 
(7 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Built-in|Branch|→}} is a [[Primitive function|primitive]] [[monadic function]] which provides a way to control execution flow in an APL programs. It is equivalent to GOTO statement in other programming languages.
{{Built-in|Branch|→}} is a special [[Primitive function|primitive]] with a [[function]]-like syntax which provides a way to control execution flow in an APL program. It fulfils the role of [[wikipedia:goto|goto]], [[wikipedia:return statement|return statement]]s, and [[wikipedia:Call_stack#Unwinding statement|call stack unwinding]] in other programming languages, though it is slightly more powerful in APL.
 
[[File:A Formal Description of System-360 page 258b.png|thumb|right|Iverson notation using flow arrows with conditions]]
== Behaviour ==
Branch was the only form of flow control in early versions of APL, having been carried over from the conditional flow arrows of [[Iverson Notation]]. Some APL dialects later added the more modern [[control structure]]s leading to deprecation of Branch.
 
Branch is unusual having syntax resembling a [[monadic function]], but affecting program flow rather than altering arrays. <span id=Abort>In addition, a so called "naked branch" or"abort", that is, a [[niladic]] <syntaxhighlight lang=apl inline>→</syntaxhighlight> will cut one level off the call stack.</span>
 
In a [[tradfn]], Branch can take a [[scalar]] or [[vector]] argument, and immediately cause execution to resume on the line indicated by the first element of the argument, which must be a non-negative integer. If the line number is 0, the function will return to its caller. If the argument is empty, the effect is that of consuming the argument and giving no result, equivalent to the dfn <syntaxhighlight lang=apl inline>{}</syntaxhighlight>. Inserting a label (an identifier followed by a colon <syntaxhighlight lang=apl inline>:</syntaxhighlight>) into a function, in a sense declares a name as a constant with the scalar value of the current number for whichever line the label occurs on. This ensures stability when lines are inserted into a function.
 
[[Dfn]]s do not support branching except the naked branch to cut the stack.
 
In a [[tacit]] function (which doesn't have its own stack frame), the effect of Branch will be exercised in its caller. Tacit functions containing Branch can therefore be used to write covers for Branch, including various conditions.
== Keyword alternatives ==
In dialects with [[control structure]]s, branching can also be effected with <syntaxhighlight lang=apl inline>:GoTo</syntaxhighlight> and specifically leaving the current function (which is normally <syntaxhighlight lang=apl inline>→0</syntaxhighlight>) can be written <syntaxhighlight lang=apl inline>:Return</syntaxhighlight>.


It appeared in early versions of APL. In some APL dialects it was superseded by the more modern [[control structure]]s.
__NOTOC__
==Examples==
==Examples==
Branch function can be used to implement [[wikipedia:Structured programming|structured programming]] constructs without the use of special keywords:<ref>[[Garth Foster|Garth H. Foster]]. (1975). [https://doi.org/10.1145/800117.803792 What lies beyond the branch arrow?].</ref>
Branch function can be used to implement [[wikipedia:Structured programming|structured programming]] constructs without the use of special keywords:<ref>[[Garth Foster|Garth H. Foster]]. (1975). [https://doi.org/10.1145/800117.803792 What lies beyond the branch arrow?].</ref>
<source lang=apl>
<syntaxhighlight lang=apl>
       ⍝ If-Then-Else construct
       ⍝ If-Then-Else construct
       →(~B)/Else
       →(~B)/Else
      S1
        S1
      →End
        →End
       Else:
       Else:
      S2
        S2
       End:
       End:
</source>
</syntaxhighlight>
<source lang=apl>
<syntaxhighlight lang=apl>
       ⍝ Select construct
       ⍝ Select construct
       →(Case1, Case2, Case3, Case4)[i]
       →(Case1, Case2, Case3, Case4)[i]
       Case1: S1
       Case1: S1
      →Next
        →Next
       Case2: S2
       Case2: S2
      →Next
        →Next
       Case3: S3
       Case3: S3
      →Next
        →Next
       Case4: S4
       Case4: S4
       Next:
       Next:
</source>
</syntaxhighlight>
<source lang=apl>
<syntaxhighlight lang=apl>
       ⍝ While-Do construct
       ⍝ While-Do construct
       While:→(~B)/Done
       While: →(~B)/Done
      S1
        S1
      →While
        →While
       Done:
       Done:
</source>
</syntaxhighlight>
<source lang=apl>
<syntaxhighlight lang=apl>
       ⍝ Repeat-Until construct
       ⍝ Repeat-Until construct
       Repeat:S2
       Repeat: S2
      →(~B)/Repeat
        →(~B)/Repeat
</source>
</syntaxhighlight>
Note that <syntaxhighlight inline lang=apl>Else</syntaxhighlight>, <syntaxhighlight inline lang=apl>End</syntaxhighlight>, <syntaxhighlight inline lang=apl>CaseN</syntaxhighlight>, <syntaxhighlight inline lang=apl>Next</syntaxhighlight>, <syntaxhighlight inline lang=apl>While</syntaxhighlight>, <syntaxhighlight inline lang=apl>Done</syntaxhighlight>, <syntaxhighlight inline lang=apl>Repeat</syntaxhighlight> in the examples above are all user-defined labels rather than keywords.


==External links==
==External links==
Line 43: Line 56:
* Bernard Legrand. [https://www.dyalog.com/uploads/documents/MasteringDyalogAPL.pdf#page=208 Mastering Dyalog APL (page 208)]. [[Dyalog Ltd]]. November 2009.
* Bernard Legrand. [https://www.dyalog.com/uploads/documents/MasteringDyalogAPL.pdf#page=208 Mastering Dyalog APL (page 208)]. [[Dyalog Ltd]]. November 2009.
=== Documentation ===
=== Documentation ===
* [http://microapl.com/apl_help/ch_020_010_043.htm APLX]
* [https://help.dyalog.com/18.0/Content/Language/Primitive%20Functions/Branch.htm Dyalog]
* [https://help.dyalog.com/18.0/Content/Language/Primitive%20Functions/Branch.htm Dyalog]
===References===
===References===
<references/>
<references/>
 
{{APL syntax}}
[[Category:APL syntax]]
[[Category:APL syntax]]

Latest revision as of 11:50, 4 July 2024

Branch () is a special primitive with a function-like syntax which provides a way to control execution flow in an APL program. It fulfils the role of goto, return statements, and call stack unwinding in other programming languages, though it is slightly more powerful in APL.

Iverson notation using flow arrows with conditions

Behaviour

Branch was the only form of flow control in early versions of APL, having been carried over from the conditional flow arrows of Iverson Notation. Some APL dialects later added the more modern control structures leading to deprecation of Branch.

Branch is unusual having syntax resembling a monadic function, but affecting program flow rather than altering arrays. In addition, a so called "naked branch" or"abort", that is, a niladic will cut one level off the call stack.

In a tradfn, Branch can take a scalar or vector argument, and immediately cause execution to resume on the line indicated by the first element of the argument, which must be a non-negative integer. If the line number is 0, the function will return to its caller. If the argument is empty, the effect is that of consuming the argument and giving no result, equivalent to the dfn {}. Inserting a label (an identifier followed by a colon :) into a function, in a sense declares a name as a constant with the scalar value of the current number for whichever line the label occurs on. This ensures stability when lines are inserted into a function.

Dfns do not support branching except the naked branch to cut the stack.

In a tacit function (which doesn't have its own stack frame), the effect of Branch will be exercised in its caller. Tacit functions containing Branch can therefore be used to write covers for Branch, including various conditions.

Keyword alternatives

In dialects with control structures, branching can also be effected with :GoTo and specifically leaving the current function (which is normally →0) can be written :Return.

Examples

Branch function can be used to implement structured programming constructs without the use of special keywords:[1]

      ⍝ If-Then-Else construct
      →(~B)/Else
        S1
        →End
      Else:
        S2
      End:
      ⍝ Select construct
      →(Case1, Case2, Case3, Case4)[i]
      Case1: S1
        →Next
      Case2: S2
        →Next
      Case3: S3
        →Next
      Case4: S4
      Next:
      ⍝ While-Do construct
      While: →(~B)/Done
        S1
        →While
      Done:
      ⍝ Repeat-Until construct
      Repeat: S2
        →(~B)/Repeat

Note that Else, End, CaseN, Next, While, Done, Repeat in the examples above are all user-defined labels rather than keywords.

External links

Tutorials

Documentation

References

APL syntax [edit]
General Comparison with traditional mathematicsPrecedenceTacit programming (Train, Hook, Split composition)
Array Numeric literalStringStrand notationObject literalArray notation (design considerations)
Function ArgumentFunction valenceDerived functionDerived operatorNiladic functionMonadic functionDyadic functionAmbivalent functionDefined function (traditional)DfnFunction train
Operator OperandOperator valenceTradopDopDerived operator
Assignment MultipleIndexedSelectiveModified
Other Function axisBracket indexingBranchStatement separatorQuad nameSystem commandUser commandKeywordDot notationFunction-operator overloadingControl structureComment