Control structure

From APL Wiki
Revision as of 21:50, 6 March 2021 by Marshall (talk | contribs) (→‎History: SAX documentation has control words)
Jump to navigation Jump to search

Some modern versions of APL include a set of keywords for controlling flow of execution. Such keywords allow programmers to create control structures which are commonly used in procedural programming languages.

Example

Dyalog APL has a rich set of flow control keywords, including :If, :While, :Repeat, :For (with the supplementary control words :In and :InEach), :Select, :With, :Trap, :Hold and :Disposable. The use of control structures defined by these keywords is only allowed in defined functions.

For example, a function implementing the Trabb Pardo–Knuth algorithm using control structures:

∇ {res}←trabb;f;S;i;a;y
  f←{(0.5*⍨|⍵)+5×⍵*3}
  S←,⍎{⍞←⍵ ⋄ (≢⍵)↓⍞}'Please, enter 11 numbers: '
  :For i a :InEach (⌽⍳≢S)(⌽S)
      :If 400<y←f(a)
          ⎕←'Too large: ',⍕i
      :Else
          ⎕←i,y
      :EndIf
  :EndFor
∇

History

Relative to other programming languages, which began to adapt structured programming in the late 1950s and almost all supported it by the end of the 1980s, APL was slow to adopt the paradigm. Adoption by mainstream array languages began in the 1990s and some dialects, such as APL2 and GNU APL, have never added support for control structures. Many dialects developed in the 2010s and later also do not include control structures, favoring lightweight dfn syntax in combination with operators such as Each.

Edsger Dijkstra's letter Go To Statement Considered Harmful, published in 1968, is widely considered a turning point in the push for structured programming. At the time, APL programs were written as defined functions using Branch for control flow, but programmers began to publish responses considering alternatives in the mid-1970s. Several programmers showed how to use structured programming in current APL systems, or modify these systems to better support it.[1][2][3] Others proposed more radical changes that would allow the user to define control structures.[4][5] Experiments to extend APL with ALGOL-style control structures also began in the 1970s. APLGOL, first described in 1972, used names beginning with an underlined character, and was supported by a compiler implemented in and targetting APL\360.[6] A similar project called SAPL (for "Structured APL") used reserved words for control structures and was published in 1978.[7]

Control structures, using reserved words, were included in A+ by 1989.[8] J added control structures such as while. in the 1994 release 2.0.1, and Dyalog introduced them with colon prefixes in version 8.0, in 1996. Both languages added for-each structures shortly afterwards. APL*PLUS included control structures by 1995.[9] They also appear in SAX, APLX, and NARS2000.

Newer APL dialects such as ngn/apl, APL\iv, dzaima/APL often discard control structures, as well as Branch, on the grounds that dfns along with operators like Each and Reduce or recursion allow similar functionality. Such a possibility was not available in the 1970s because APLs at the time did not allow arbitrary functions to be operands, and was not generally considered before the rise of dfns and tacit programming in the 1990s. April does not support control structures on the grounds that April code should be embedded in Common Lisp, which can handle control flow better. BQN also does not include pre-defined control structures, but its first-class functions and list literals allow a similar syntax to be achieved without extending the language.[10]

External links

Tutorials

Documentation

References

  1. W. K. Giloi and R. Hoffmann. Adding a modern control structure to APL without changing the syntax at APL76.
  2. Garth Foster. On the locus of program flow within and among secondary functions at APL79.
  3. Edward V. Eusebi. Operators for program control at APL85.
  4. Denis P. Samson. A proposal for control structures in APL at APL84.
  5. Robert G. Willhoft. Structured APL: a proposal for block structured control flow in APL at APL93.
  6. R. A. Kelley. "APLGOL, a Structured Programming Language for APL", IBM Palo Alto Scientific Center Report No. 320-3299, August 1972.
  7. Franklin Kemp. Design of a structured APL. Quote Quad Volume 9 Issue 1. 1978-09.
  8. Roger Hui and Morten Kromberg. APL since 1978. ACM HOPL IV. 2020-06.
  9. Robert Bernecky. The role of dynamic programming & control structures in performance at APL95.
  10. Marshall Lochbaum. Control flow in BQN. Accessed 2021-03-06.
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