2,962
edits
m (Text replacement - "<source" to "<syntaxhighlight") Tags: Mobile edit Mobile web edit |
m (→Singleton extension: HOPL 4 paper has a nice table of conformability support) |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 3: | Line 3: | ||
== History and terminology == | == History and terminology == | ||
The concept of scalar extension has been around since [[APL\360]]. An example which extends the scalar <syntaxhighlight lang=apl inline>2</ | The concept of scalar extension has been around since [[APL\360]]. An example which extends the scalar <syntaxhighlight lang=apl inline>2</syntaxhighlight> is: | ||
<syntaxhighlight lang=apl> | <syntaxhighlight lang=apl> | ||
2 × 1 2 3 4 | 2 × 1 2 3 4 | ||
2 4 6 8 | 2 4 6 8 | ||
</ | </syntaxhighlight> | ||
[[A Programming Language]] describes the above computation as a "scalar multiple" but does not generalise it to arbitrary [[scalar function]]s, so it's unclear when scalar extension as a unified concept was adopted in [[Iverson notation]]. | [[A Programming Language]] describes the above computation as a "scalar multiple" but does not generalise it to arbitrary [[scalar function]]s, so it's unclear when scalar extension as a unified concept was adopted in [[Iverson notation]]. | ||
The word "extension" applies to scalar extension in two ways: first, a function is extended by making a case which would have been a [[RANK ERROR]] into a valid application. Second, the application works by conceptually extending the scalar to function as though it were an array of higher rank. | The word "extension" applies to scalar extension in two ways: first, a function is extended by making a case which would have been a [[RANK ERROR]] into a valid application. Second, the application works by conceptually extending the scalar to function as though it were an array of higher rank. | ||
Two arrays are said to [[Conformability|conform]] if they have the same shape or at least one can be extended (it is a scalar, or, in langauges with singleton extension, has exactly one element). A pair of conforming arrays defines a single shape which describes how their elements are paired: if neither is a scalar, it is their shared shape; if one is a scalar, it is the other's shape; if both are scalars, it is the [[empty]] vector, <syntaxhighlight lang=apl inline>⍬</ | Two arrays are said to [[Conformability|conform]] if they have the same shape or at least one can be extended (it is a scalar, or, in langauges with singleton extension, has exactly one element). A pair of conforming arrays defines a single shape which describes how their elements are paired: if neither is a scalar, it is their shared shape; if one is a scalar, it is the other's shape; if both are scalars, it is the [[empty]] vector, <syntaxhighlight lang=apl inline>⍬</syntaxhighlight> ([[Zilde]]). | ||
=== Rank extension === | === Rank extension === | ||
The term "scalar extension" is sometimes used to refer to the practice of allowing a scalar when a higher rank is expected. The scalar is treated as an array of the expected minimum rank whose shape is a vector of 1s (that is, a [[singleton]]). For example, <syntaxhighlight lang=apl inline>⍳8</ | The term "scalar extension" is sometimes used to refer to the practice of allowing a scalar when a higher rank is expected. The scalar is treated as an array of the expected minimum rank whose shape is a vector of 1s (that is, a [[singleton]]). For example, <syntaxhighlight lang=apl inline>⍳8</syntaxhighlight> and <syntaxhighlight lang=apl inline>8⍴'a'</syntaxhighlight> both produce an array of shape <syntaxhighlight lang=apl inline>,8</syntaxhighlight> (a vector) even though they were given a shape specification of <syntaxhighlight lang=apl inline>8</syntaxhighlight> (a scalar). This type of extension, which differs from ordinary scalar extension in that there is no expected shape and only an expected rank, has also been present since [[APL\360]]. | ||
=== Singleton extension === | === Singleton extension === | ||
Most APLs treat arrays with one element ([[singleton]]s) as scalars for the purposes of scalar extension. While often referred to simply as "scalar extension", this practice could more precisely be called "singleton extension". For example, | |||
<syntaxhighlight lang=apl> | <syntaxhighlight lang=apl> | ||
(1 1⍴5) + 10 20 | (1 1⍴5) + 10 20 | ||
Line 26: | Line 26: | ||
⍴ (1 1⍴5) + 10 20 | ⍴ (1 1⍴5) + 10 20 | ||
2 | 2 | ||
</ | </syntaxhighlight> | ||
In this case addition accepts a singleton, and discards its shape. If two singletons are used as arguments, they are still considered to [[Conformability|conform]]; the shape of the result is taken from the argument with higher rank. | In this case addition accepts a singleton, and discards its shape. If two singletons are used as arguments, they are still considered to [[Conformability|conform]]; the shape of the result is taken from the argument with higher rank. | ||
Singleton extension was supported in [[APL\360]] by 1970<ref>S. Charmonman. [https://dl.acm.org/doi/10.1145/987461.987468 A generalization of APL array-oriented concept]. [[APL Quote Quad]] Volume 2, Number 3. 1970-09.</ref> and is generally present in later APLs. However, [[APL2]] and specification [[ISO/IEC_13751:2001]] only extend a one-element vector and not any singleton,<ref>[[Roger Hui]] and [[Morten Kromberg]]. [https://dl.acm.org/doi/abs/10.1145/3386319 ''APL since 1978'']. ACM HOPL IV. 2020-06. §2.1 Tally.</ref> and some newer dialects such as [[dzaima/APL]] and [[Kap]] don't implement singleton extension. | |||
Singleton extension can sometimes conflict with other extensions, an issue which does not occur with scalar extension. If a function is extended to allow a shorter vector argument to be extended (perhaps by padding with 0), but it also supports singleton extension, then there is a conflict with length-1 vectors. | Singleton extension can sometimes conflict with other extensions, an issue which does not occur with scalar extension. If a function is extended to allow a shorter vector argument to be extended (perhaps by padding with 0), but it also supports singleton extension, then there is a conflict with length-1 vectors. | ||
Line 46: | Line 47: | ||
│100 1│100 2│100 3│100 4│ | │100 1│100 2│100 3│100 4│ | ||
└─────┴─────┴─────┴─────┘ | └─────┴─────┴─────┴─────┘ | ||
</ | </syntaxhighlight> | ||
[[Replicate]] and [[Partitioned Enclose]] (and also [[Partition]], but this is less useful, as it is equivalent to <syntaxhighlight lang=apl inline>,⊂</ | [[Replicate]] and [[Partitioned Enclose]] (and also [[Partition]], but this is less useful, as it is equivalent to <syntaxhighlight lang=apl inline>,⊂</syntaxhighlight> or <syntaxhighlight lang=apl inline>{0⍴⊂0⍴⍵}</syntaxhighlight>) extend a scalar left argument to apply to each column of the right argument: | ||
<syntaxhighlight lang=apl> | <syntaxhighlight lang=apl> | ||
2/'abc' | 2/'abc' | ||
Line 57: | Line 58: | ||
││a││b││c│ | ││a││b││c│ | ||
└┴─┴┴─┴┴─┘ | └┴─┴┴─┴┴─┘ | ||
</ | </syntaxhighlight> | ||
[[Decode]] uses extends a single radix left argument to apply to all digit values in the right argument: | [[Decode]] uses extends a single radix left argument to apply to all digit values in the right argument: | ||
Line 63: | Line 64: | ||
2⊥1 0 1 | 2⊥1 0 1 | ||
5 | 5 | ||
</ | </syntaxhighlight> | ||
[[APL2]] and [[Dyalog APL]] use a variant of singleton extension when the selected axis of the right argument has length one: each element along that axis is reused for every element of the left argument. | [[APL2]] and [[Dyalog APL]] use a variant of singleton extension when the selected axis of the right argument has length one: each element along that axis is reused for every element of the left argument. | ||
Line 69: | Line 70: | ||
⍴ 2 ¯3 /[2] 7 1 8⍴⍳56 | ⍴ 2 ¯3 /[2] 7 1 8⍴⍳56 | ||
7 5 8 | 7 5 8 | ||
</ | </syntaxhighlight> | ||
{{Works in|[[Dyalog APL]], [[APL2]], [[APLX]]}} | {{Works in|[[Dyalog APL]], [[APL2]], [[APLX]]}} | ||
Line 78: | Line 79: | ||
endext | endext | ||
larsca | larsca | ||
</ | </syntaxhighlight> | ||
=== Each left and each right === | === Each left and each right === | ||
Line 92: | Line 93: | ||
│1 2 3 100│1 2 3 200│ | │1 2 3 100│1 2 3 200│ | ||
└─────────┴─────────┘ | └─────────┴─────────┘ | ||
</ | </syntaxhighlight> | ||
For [[scalar function]]s, explicit use of the [[Each]] operator is unnecessary: | For [[scalar function]]s, explicit use of the [[Each]] operator is unnecessary: | ||
<syntaxhighlight lang=apl> | <syntaxhighlight lang=apl> | ||
Line 103: | Line 104: | ||
│101 102 103│201 202 203│ | │101 102 103│201 202 203│ | ||
└───────────┴───────────┘ | └───────────┴───────────┘ | ||
</ | </syntaxhighlight> | ||
[[Bind]]ing one argument to the function also works, but this always requires the Each operator: | [[Bind]]ing one argument to the function also works, but this always requires the Each operator: | ||
<syntaxhighlight lang=apl> | <syntaxhighlight lang=apl> | ||
Line 114: | Line 115: | ||
│1 100 200│2 100 200│3 100 200│ | │1 100 200│2 100 200│3 100 200│ | ||
└─────────┴─────────┴─────────┘ | └─────────┴─────────┴─────────┘ | ||
</ | </syntaxhighlight> | ||
== References == | |||
<references/> | |||
{{APL features}}[[Category:Function characteristics]][[Category:Conformability]] | {{APL features}}[[Category:Function characteristics]][[Category:Conformability]] |