# Array notation: Difference between revisions

(Link is the primitive) |
(Neutral description, with more info moved to Array notation design considerations) |
||

Line 1: | Line 1: | ||

'''Array notation''' is a way to write most [[array]]s literally, with no or minimal use of [[primitive function]]s, possibly over multiple code lines. It differs from the [[strand notation]] existing since [[APL\360]] in that it can be used to write arrays of rank greater than one. | '''Array notation''' is a way to write most [[array]]s literally, with no or minimal use of [[primitive function]]s, possibly over multiple code lines. It differs from the [[strand notation]], existing since [[APL\360]], in that it can be used to write arrays of [[rank]] greater than one. This article describes the syntax supported in [[dzaima/APL]], and by some tools for [[Dyalog APL]], where it is planned as an eventual language feature. See also [[Array notation design considerations]]. | ||

The array notation consists of a vector notation written with round parentheses <source lang=apl inline>()</source>, roughly equivalent to stranding, and a high-rank notation using square brackets <source lang=apl inline>[]</source>, indicating the [[Mix]] of a vector. It also supports [[namespace]]s, using <source lang=apl inline>name:value</source> syntax in round parentheses. Elements and [[wikipedia:name–value_pair|name–value_pair]]s are separated by [[statement separator]]s; [[Diamond]]s (<source lang=apl inline>⋄</source>) or line breaks. | |||

== Examples == | == Examples == | ||

Line 19: | Line 19: | ||

'lnd' ((0 0 ⋄ 0 0 ⋄ 0 0)×size)] | 'lnd' ((0 0 ⋄ 0 0 ⋄ 0 0)×size)] | ||

</source> | </source> | ||

[[File:Array notation syntax.png|thumb|right|[[wikipedia:Railroad diagram|Railroad diagram]].]] | |||

== Description == | == Description == | ||

The notation | The notation consists of syntax that was invalid before its introduction, thus causing no issues for [[backwards compatibility]]. The added syntax consists of three constructs that are currently [[SYNTAX ERROR]]s: | ||

* ''broken'' round parentheses | * ''broken'' round parentheses: <source lang=apl inline>(</source>…<source lang=apl inline>)</source> | ||

* ''broken'' square brackets | * ''broken'' square brackets: <source lang=apl inline>[</source>…<source lang=apl inline>]</source> | ||

* empty round parentheses: <source lang=apl inline>()</source> | * empty round parentheses: <source lang=apl inline>()</source> | ||

Line 34: | Line 34: | ||

* <source lang=apl inline>()</source> is equivalent to <source lang=apl inline>(⎕NS 0⍴⊂'')</source> | * <source lang=apl inline>()</source> is equivalent to <source lang=apl inline>(⎕NS 0⍴⊂'')</source> | ||

* A ''name-value pair'' consist of a valid APL identifier, followed by a <source lang=apl inline>:</source> and a value expression. | * A ''name-value pair'' consist of a valid APL identifier, followed by a <source lang=apl inline>:</source> and a value expression. | ||

=== Formal syntax === | |||

The array notation can be described using [[wikipedia:Extended Backus–Naur form|Extended Backus–Naur form]], where an <code>expression</code> is any traditional APL expression: | |||

<pre> | |||

value ::= expression | list | block | space | |||

list ::= '(' ( ( value sep )+ value? | ( sep value )+ sep? ) ')' | |||

block ::= '[' ( ( value sep )+ value? | ( sep value )+ sep? ) ']' | |||

space ::= '(' sep? ( name ':' value ( sep name ':' value )* )? sep? ')' | |||

sep ::= [⋄#x000A#x000D#x0085]+ | |||

</pre> | |||

== History == | == History == | ||

:''See also [[Array notation | :''See also the [[Array notation design considerations#Timeline]]'' | ||

One-dimensional list syntax with surrounding brackets and delimiters, matching [[wikipedia:sequence|sequence]] notation in mathematics, is common in programming. It appears as early as [[wikipedia:ALGOL 68|ALGOL 68]] with parentheses, and square-bracket lists feature in languages from the 1970s such as [[wikipedia:ML (programming language)|ML]] and [[wikipedia:Icon (programming language)|Icon]]. [[MATLAB]] uses matrix syntax with square brackets, semicolons to separate rows, and commas to separate elements within a row. [[wikipedia:FP (programming language)|FP]] uses angle brackets for lists, and square brackets for function "construction", with behavior like [[function array]]s. | One-dimensional list syntax with surrounding brackets and delimiters, matching [[wikipedia:sequence|sequence]] notation in mathematics, is common in programming. It appears as early as [[wikipedia:ALGOL 68|ALGOL 68]] with parentheses, and square-bracket lists feature in languages from the 1970s such as [[wikipedia:ML (programming language)|ML]] and [[wikipedia:Icon (programming language)|Icon]]. [[MATLAB]] uses matrix syntax with square brackets, semicolons to separate rows, and commas to separate elements within a row. [[wikipedia:FP (programming language)|FP]] uses angle brackets for lists, and square brackets for function "construction", with behavior like [[function array]]s. | ||

Line 44: | Line 54: | ||

The first published proposals that influenced [[Dyalog APL]]'s array notation were made by [[Phil Last]] at [[Dyalog '15]] and later in [[Vector Journal]].<ref>[[Phil Last]]. [https://dyalog.tv/Dyalog15/?v=9-HAvTMhYao APL Array Notation] ([https://www.dyalog.com/uploads/conference/dyalog15/presentations/U07_APL_Array_Notation.pdf transcript]). [[Dyalog '15]].</ref><ref>[[Phil Last]]. [http://archive.vector.org.uk/art10501450 A Notation for APL array Embedding and Serialization]. [[Vector Journal]], Volume 26, number 4. [[British APL Association]]. 2016.</ref> Last cited the syntax of [[dfn]]s as a sequence of expressions with enclosing braces, as well as [[APL#]]'s namespace notation enclosed in double brackets <code>[[]]</code>, as precursors. He also used the design in Acre Desktop, a project manager for Dyalog APL, to support storing constant arrays and namespaces in text files. Following the conference presentation, [[Adám Brudzewsky]] began work on array notation and presented on it in a series of conferences, initially using parentheses for the high-rank notation<ref>[[Adám Brudzewsky]]. [https://dyalog.tv/Dyalog17/?v=CRQNzL8cUQE Literal Notation for Arrays and Namespaces] ([https://www.dyalog.com/uploads/conference/dyalog17/presentations/D11_Literal_Notation_for_Arrays_and_Namespaces.pdf slides]). [[Dyalog '17]].</ref> and later returning to square brackets.<ref>[[Adám Brudzewsky]]. [https://dyalog.tv/Dyalog18/?v=GAdQuOtPcfM Array Notation Mk III]. [[Dyalog '18]].</ref><ref>[[Adám Brudzewsky]]. [https://apl-germany.de/wp-content/uploads/2021/11/APL_Journal_2020_1u2.pdf#page=34 A Notation for APL Arrays]. APL-Journal, Volume 2020, number 1-2. [[APL Germany|APL-Germany e.V.]] 2020.</ref> Because Last's use of <source lang=apl inline>←</source> to separate namespace keys from values prevented lists from including arbitrary expressions (which might contain assignment), he proposed a change to <source lang=apl inline>:</source> as in [[wikipedia:JSON|JSON]]. [[Dyalog APL 18.0]], released in 2020, included support for array notation in source files loaded by Link<ref>[[Dyalog Ltd]]. [https://dyalog.github.io/link/3.0/Discussion/TechDetails/#creating-apl-source-files-and-directories Link User Guide: Creating APL Source Files and Directories]. Retrieved 2022-08-24.</ref>, but not in the language itself.<ref>[[Adám Brudzewsky]]. [https://dyalog.tv/Dyalog20/?v=5drncJiWOM4 Array Notation RC1] ([https://www.dyalog.com/uploads/conference/dyalog20/presentations/D09_Array_Notation_RC1.pdf slides]). [[Dyalog '20]].</ref> | The first published proposals that influenced [[Dyalog APL]]'s array notation were made by [[Phil Last]] at [[Dyalog '15]] and later in [[Vector Journal]].<ref>[[Phil Last]]. [https://dyalog.tv/Dyalog15/?v=9-HAvTMhYao APL Array Notation] ([https://www.dyalog.com/uploads/conference/dyalog15/presentations/U07_APL_Array_Notation.pdf transcript]). [[Dyalog '15]].</ref><ref>[[Phil Last]]. [http://archive.vector.org.uk/art10501450 A Notation for APL array Embedding and Serialization]. [[Vector Journal]], Volume 26, number 4. [[British APL Association]]. 2016.</ref> Last cited the syntax of [[dfn]]s as a sequence of expressions with enclosing braces, as well as [[APL#]]'s namespace notation enclosed in double brackets <code>[[]]</code>, as precursors. He also used the design in Acre Desktop, a project manager for Dyalog APL, to support storing constant arrays and namespaces in text files. Following the conference presentation, [[Adám Brudzewsky]] began work on array notation and presented on it in a series of conferences, initially using parentheses for the high-rank notation<ref>[[Adám Brudzewsky]]. [https://dyalog.tv/Dyalog17/?v=CRQNzL8cUQE Literal Notation for Arrays and Namespaces] ([https://www.dyalog.com/uploads/conference/dyalog17/presentations/D11_Literal_Notation_for_Arrays_and_Namespaces.pdf slides]). [[Dyalog '17]].</ref> and later returning to square brackets.<ref>[[Adám Brudzewsky]]. [https://dyalog.tv/Dyalog18/?v=GAdQuOtPcfM Array Notation Mk III]. [[Dyalog '18]].</ref><ref>[[Adám Brudzewsky]]. [https://apl-germany.de/wp-content/uploads/2021/11/APL_Journal_2020_1u2.pdf#page=34 A Notation for APL Arrays]. APL-Journal, Volume 2020, number 1-2. [[APL Germany|APL-Germany e.V.]] 2020.</ref> Because Last's use of <source lang=apl inline>←</source> to separate namespace keys from values prevented lists from including arbitrary expressions (which might contain assignment), he proposed a change to <source lang=apl inline>:</source> as in [[wikipedia:JSON|JSON]]. [[Dyalog APL 18.0]], released in 2020, included support for array notation in source files loaded by Link<ref>[[Dyalog Ltd]]. [https://dyalog.github.io/link/3.0/Discussion/TechDetails/#creating-apl-source-files-and-directories Link User Guide: Creating APL Source Files and Directories]. Retrieved 2022-08-24.</ref>, but not in the language itself.<ref>[[Adám Brudzewsky]]. [https://dyalog.tv/Dyalog20/?v=5drncJiWOM4 Array Notation RC1] ([https://www.dyalog.com/uploads/conference/dyalog20/presentations/D09_Array_Notation_RC1.pdf slides]). [[Dyalog '20]].</ref> | ||

[[dzaima/APL]] added support for vector notation with parentheses in 2018, namespaces and function arrays in 2019, and high-rank arrays with square brackets in 2020. [[BQN]] supported lists with angle brackets <code> | The project manager Acre Desktop added support for the non-namespace parts of the notation in early 2018, together with Phil Last's original namespace notation, using square brackets and assignment arrow. [[dzaima/APL]] added support for vector notation with parentheses in 2018, namespaces and function arrays in 2019, and high-rank arrays with square brackets in 2020. [[BQN]] supported lists with angle brackets (<code>⟨</code>…<code>⟩</code>) in its initial implementation in 2020; square brackets (<code>[</code>…<code>]</code>) were reserved for high-rank array notation, which was implemented in 2022. | ||

== References == | == References == | ||

<references/> | <references/> | ||

{{APL syntax}}[[Category:APL syntax]][[Category:Nested array model]] | {{APL syntax}}[[Category:APL syntax]][[Category:Nested array model]] |

## Revision as of 10:52, 2 September 2022

**Array notation** is a way to write most arrays literally, with no or minimal use of primitive functions, possibly over multiple code lines. It differs from the strand notation, existing since APL\360, in that it can be used to write arrays of rank greater than one. This article describes the syntax supported in dzaima/APL, and by some tools for Dyalog APL, where it is planned as an eventual language feature. See also Array notation design considerations.

The array notation consists of a vector notation written with round parentheses `()`

, roughly equivalent to stranding, and a high-rank notation using square brackets `[]`

, indicating the Mix of a vector. It also supports namespaces, using `name:value`

syntax in round parentheses. Elements and name–value_pairs are separated by statement separators; Diamonds (`⋄`

) or line breaks.

## Examples

Medium-sized array constants are often needed in code. Due to the lack of a native multi-line notation, programmers have resorted to various ad-hoc methods of approximating such, usually at the cost of reduced readability. A very common technique is repeated concatenation:

```
poss←1 2⍴'fns' ((0 1)(0.7 0)(0.7 0)×size)
poss⍪← 'fnd' ((0 1)(0 0)(0 0)×size)
poss⍪← 'lines'((0 0)(0.7 0)(0.7 0)×size)
poss⍪← 'lnd' ((0 0)(0 0)(0 0)×size)
```

Array notation allows this multi-line construction to be made with a single assignment, and also provides an alternate syntax for the inner vectors of vectors:

```
poss←['fns' ((0 1 ⋄ 0.7 0 ⋄ 0.7 0)×size)
'fnd' ((0 1 ⋄ 0 0 ⋄ 0 0)×size)
'lines'((0 0 ⋄ 0.7 0 ⋄ 0.7 0)×size)
'lnd' ((0 0 ⋄ 0 0 ⋄ 0 0)×size)]
```

## Description

The notation consists of syntax that was invalid before its introduction, thus causing no issues for backwards compatibility. The added syntax consists of three constructs that are currently SYNTAX ERRORs:

*broken*round parentheses:`(`

…`)`

*broken*square brackets:`[`

…`]`

- empty round parentheses:
`()`

where *broken* means interrupted by one or more diamonds (`⋄`

) or line breaks (outside of dfns).

- A
*broken*round parenthesis creates a namespace if every diamond/line break-separated statement is a*name-value pair*. - A
*broken*round parenthesis creates a vector if every diamond/line break-separated statement is a value expression. In that case, every such statement forms an element in the resulting vector. - A
*broken*square bracket creates a an array where every diamond/line break-separated statement forms a major cell in the resulting array. `()`

is equivalent to`(⎕NS 0⍴⊂'')`

- A
*name-value pair*consist of a valid APL identifier, followed by a`:`

and a value expression.

### Formal syntax

The array notation can be described using Extended Backus–Naur form, where an `expression`

is any traditional APL expression:

value ::= expression | list | block | space list ::= '(' ( ( value sep )+ value? | ( sep value )+ sep? ) ')' block ::= '[' ( ( value sep )+ value? | ( sep value )+ sep? ) ']' space ::= '(' sep? ( name ':' value ( sep name ':' value )* )? sep? ')' sep ::= [⋄#x000A#x000D#x0085]+

## History

*See also the Array notation design considerations#Timeline*

One-dimensional list syntax with surrounding brackets and delimiters, matching sequence notation in mathematics, is common in programming. It appears as early as ALGOL 68 with parentheses, and square-bracket lists feature in languages from the 1970s such as ML and Icon. MATLAB uses matrix syntax with square brackets, semicolons to separate rows, and commas to separate elements within a row. FP uses angle brackets for lists, and square brackets for function "construction", with behavior like function arrays.

List notation appears in Nial using brackets and commas like `[a,b,c]`

, and allowing function arrays called "atlases". A+ and K have a list notation using parentheses and semicolons like `(a;b;c)`

. In A+ this is related to bracket indexing and an "expression group" notation written with curly braces and semicolons. It allows line breaks, but in addition to rather than in place of semicolons. The later K version corresponds more closely to APL: the semicolon is a statement separator and is interchangeable with a line break, and because K represents arrays with nested lists, it corresponds to both vector and high-rank array notation.

The first published proposals that influenced Dyalog APL's array notation were made by Phil Last at Dyalog '15 and later in Vector Journal.^{[1]}^{[2]} Last cited the syntax of dfns as a sequence of expressions with enclosing braces, as well as APL#'s namespace notation enclosed in double brackets `[[]]`

, as precursors. He also used the design in Acre Desktop, a project manager for Dyalog APL, to support storing constant arrays and namespaces in text files. Following the conference presentation, Adám Brudzewsky began work on array notation and presented on it in a series of conferences, initially using parentheses for the high-rank notation^{[3]} and later returning to square brackets.^{[4]}^{[5]} Because Last's use of `←`

to separate namespace keys from values prevented lists from including arbitrary expressions (which might contain assignment), he proposed a change to `:`

as in JSON. Dyalog APL 18.0, released in 2020, included support for array notation in source files loaded by Link^{[6]}, but not in the language itself.^{[7]}

The project manager Acre Desktop added support for the non-namespace parts of the notation in early 2018, together with Phil Last's original namespace notation, using square brackets and assignment arrow. dzaima/APL added support for vector notation with parentheses in 2018, namespaces and function arrays in 2019, and high-rank arrays with square brackets in 2020. BQN supported lists with angle brackets (`⟨`

…`⟩`

) in its initial implementation in 2020; square brackets (`[`

…`]`

) were reserved for high-rank array notation, which was implemented in 2022.

## References

- ↑ Phil Last. APL Array Notation (transcript). Dyalog '15.
- ↑ Phil Last. A Notation for APL array Embedding and Serialization. Vector Journal, Volume 26, number 4. British APL Association. 2016.
- ↑ Adám Brudzewsky. Literal Notation for Arrays and Namespaces (slides). Dyalog '17.
- ↑ Adám Brudzewsky. Array Notation Mk III. Dyalog '18.
- ↑ Adám Brudzewsky. A Notation for APL Arrays. APL-Journal, Volume 2020, number 1-2. APL-Germany e.V. 2020.
- ↑ Dyalog Ltd. Link User Guide: Creating APL Source Files and Directories. Retrieved 2022-08-24.
- ↑ Adám Brudzewsky. Array Notation RC1 (slides). Dyalog '20.