Prototype: Difference between revisions
m (Text replacement - " ⊢( *[^∘])" to " ⎕←$1") |
m (Text replacement - "</source>" to "</syntaxhighlight>") |
||
Line 3: | Line 3: | ||
== Examples == | == Examples == | ||
The prototype is used when an array is expanded or when empty elements are inserted in some other way. [[Take]] and [[Expand]] on a [[character]] array produce an array with spaces, because <source lang=apl inline>' '</ | The prototype is used when an array is expanded or when empty elements are inserted in some other way. [[Take]] and [[Expand]] on a [[character]] array produce an array with spaces, because <source lang=apl inline>' '</syntaxhighlight> is the prototype of a character array: | ||
<source lang=apl> | <source lang=apl> | ||
¯12 ↑ 'whitespace' | ¯12 ↑ 'whitespace' | ||
Line 9: | Line 9: | ||
(5 1 5/1 ¯2 1) \ 'whitespace' | (5 1 5/1 ¯2 1) \ 'whitespace' | ||
white space | white space | ||
</ | </syntaxhighlight> | ||
The [[Rank operator]] combines its left operand's result cells by extending them to a common shape like [[Mix]] does. Numeric vectors of different lengths will be expanded with <source lang=apl inline>0</ | The [[Rank operator]] combines its left operand's result cells by extending them to a common shape like [[Mix]] does. Numeric vectors of different lengths will be expanded with <source lang=apl inline>0</syntaxhighlight>, the prototype for a simple numeric array. | ||
<source lang=apl> | <source lang=apl> | ||
(⍳⍤0) 2 3 4 | (⍳⍤0) 2 3 4 | ||
Line 17: | Line 17: | ||
1 2 3 0 | 1 2 3 0 | ||
1 2 3 4 | 1 2 3 4 | ||
</ | </syntaxhighlight> | ||
{{Works in|[[Dyalog APL]]}} | {{Works in|[[Dyalog APL]]}} | ||
An array's prototype is based on its first element, so the array <source lang=apl inline>a</ | An array's prototype is based on its first element, so the array <source lang=apl inline>a</syntaxhighlight> below has a simple numeric prototype, as does any prefix of <source lang=apl inline>a</syntaxhighlight>. This property even applies to empty arrays: the expression <source lang=apl inline>0 ↑ a</syntaxhighlight> results in an empty array with the same prototype as <source lang=apl inline>a</syntaxhighlight>. | ||
<source lang=apl> | <source lang=apl> | ||
⎕←a ← 5 'c' ¯2 | ⎕←a ← 5 'c' ¯2 | ||
Line 30: | Line 30: | ||
4 ↑ 0 ↑ a | 4 ↑ 0 ↑ a | ||
0 0 0 0 | 0 0 0 0 | ||
</ | </syntaxhighlight> | ||
{{Works in|[[Dyalog APL]]}} | {{Works in|[[Dyalog APL]]}} | ||
Line 52: | Line 52: | ||
│ │0 0 0│ | │ │0 0 0│ | ||
└──┴─────┘ | └──┴─────┘ | ||
</ | </syntaxhighlight> | ||
{{Works in|[[Dyalog APL]]}} | {{Works in|[[Dyalog APL]]}} | ||
Line 62: | Line 62: | ||
│0│0│ │ | │0│0│ │ | ||
└─┴─┴──┘ | └─┴─┴──┘ | ||
</ | </syntaxhighlight> | ||
{{Works in|[[NARS2000]]}} | {{Works in|[[NARS2000]]}} | ||
<source lang=apl> | <source lang=apl> | ||
Line 69: | Line 69: | ||
│0│0│ │ | │0│0│ │ | ||
└─┴─┴──┘ | └─┴─┴──┘ | ||
</ | </syntaxhighlight> | ||
{{Works in|[[Dyalog APL]] with [[migration level]]<nowiki>=</nowiki>0}} | {{Works in|[[Dyalog APL]] with [[migration level]]<nowiki>=</nowiki>0}} | ||
However, an array's prototype can always be determined by reshaping the array to become empty, and then coercing out a fill element: | However, an array's prototype can always be determined by reshaping the array to become empty, and then coercing out a fill element: | ||
Line 77: | Line 77: | ||
│0│0│ │ | │0│0│ │ | ||
└─┴─┴──┘ | └─┴─┴──┘ | ||
</ | </syntaxhighlight> | ||
{{Works in|[[Dyalog APL]] with [[migration level]]<nowiki>≥</nowiki>2, [[APL2]], [[APLX]]}} | {{Works in|[[Dyalog APL]] with [[migration level]]<nowiki>≥</nowiki>2, [[APL2]], [[APLX]]}} | ||
[https://tryapl.org/?a=%u2283%200%20%u2374%20%281%202%20%27ab%27%29%203%204&run Try it now!] | [https://tryapl.org/?a=%u2283%200%20%u2374%20%281%202%20%27ab%27%29%203%204&run Try it now!] | ||
Line 85: | Line 85: | ||
│0│0│ │ | │0│0│ │ | ||
└─┴─┴──┘ | └─┴─┴──┘ | ||
</ | </syntaxhighlight> | ||
{{Works in|[[Dyalog APL]] with [[migration level]]<nowiki>=</nowiki>1}} | {{Works in|[[Dyalog APL]] with [[migration level]]<nowiki>=</nowiki>1}} | ||
APLs with a [[flat array model]] do not typically store prototype information, instead using only the array's type ([[character]], [[numeric]], or [[Box|boxed]]) to determine its [[Fill element|fills]]. | APLs with a [[flat array model]] do not typically store prototype information, instead using only the array's type ([[character]], [[numeric]], or [[Box|boxed]]) to determine its [[Fill element|fills]]. | ||
{{APL features}}[[Category:Array relationships]][[Category:Array characteristics]] | {{APL features}}[[Category:Array relationships]][[Category:Array characteristics]] |
Revision as of 22:03, 10 September 2022
The prototype of an array is, in the nested array model, an array which gives information about the type and structure of its elements. It is derived from the first element of the array in ravel order, or, if the array is empty, from information stored alongside the array (usually this information is just the prototype itself). An array's prototype is used as a fill element for operations involving that array, and to determine some identity elements.
Examples
The prototype is used when an array is expanded or when empty elements are inserted in some other way. Take and Expand on a character array produce an array with spaces, because <source lang=apl inline>' '</syntaxhighlight> is the prototype of a character array: <source lang=apl>
¯12 ↑ 'whitespace' whitespace (5 1 5/1 ¯2 1) \ 'whitespace'
white space </syntaxhighlight>
The Rank operator combines its left operand's result cells by extending them to a common shape like Mix does. Numeric vectors of different lengths will be expanded with <source lang=apl inline>0</syntaxhighlight>, the prototype for a simple numeric array. <source lang=apl>
(⍳⍤0) 2 3 4
1 2 0 0 1 2 3 0 1 2 3 4 </syntaxhighlight>
An array's prototype is based on its first element, so the array <source lang=apl inline>a</syntaxhighlight> below has a simple numeric prototype, as does any prefix of <source lang=apl inline>a</syntaxhighlight>. This property even applies to empty arrays: the expression <source lang=apl inline>0 ↑ a</syntaxhighlight> results in an empty array with the same prototype as <source lang=apl inline>a</syntaxhighlight>. <source lang=apl>
⎕←a ← 5 'c' ¯2
5 c ¯2
4 ↑ a
5 c ¯2 0
4 ↑ 2 ↑ a
5 c 0 0
4 ↑ 0 ↑ a
0 0 0 0 </syntaxhighlight>
The prototype of an array may be nested. Here, we inspect the prototype of an array containing both character and numeric data. In the prototype, all characters are converted to spaces and all numbers to zeros. Thus the prototype retains type and structure information but not specific values. <source lang=apl>
⎕←x ← ⊂'de'(3 4 5) ⍝ A complicated scalar array
┌──────────┐ │┌──┬─────┐│ ││de│3 4 5││ │└──┴─────┘│ └──────────┘
0 1 \ x ⍝ Its fill element is nested
┌──────────┬──────────┐ │┌──┬─────┐│┌──┬─────┐│ ││ │0 0 0│││de│3 4 5││ │└──┴─────┘│└──┴─────┘│ └──────────┴──────────┘
e ← 0 ↑ x ⍝ An empty array based on x ⊃e ⍝ Disclosing gets the prototype
┌──┬─────┐ │ │0 0 0│ └──┴─────┘ </syntaxhighlight>
Support
A few dialects have Type as a primitive function, and in those, the prototype is simply the type of the first element: <source lang=apl>
⊤↑ (1 2 'ab') 3 4
┌─┬─┬──┐ │0│0│ │ └─┴─┴──┘ </syntaxhighlight>
<source lang=apl>
∊⊃ (1 2 'ab') 3 4
┌─┬─┬──┐ │0│0│ │ └─┴─┴──┘ </syntaxhighlight>
However, an array's prototype can always be determined by reshaping the array to become empty, and then coercing out a fill element: <source lang=apl>
⊃ 0 ⍴ (1 2 'ab') 3 4
┌─┬─┬──┐ │0│0│ │ └─┴─┴──┘ </syntaxhighlight>
Try it now! <source lang=apl>
⊃ 0 ⍴ (1 2 'ab') 3 4
┌─┬─┬──┐ │0│0│ │ └─┴─┴──┘ </syntaxhighlight>
APLs with a flat array model do not typically store prototype information, instead using only the array's type (character, numeric, or boxed) to determine its fills.
APL features [edit] | |
---|---|
Built-ins | Primitives (functions, operators) ∙ Quad name |
Array model | Shape ∙ Rank ∙ Depth ∙ Bound ∙ Index (Indexing) ∙ Axis ∙ Ravel ∙ Ravel order ∙ Element ∙ Scalar ∙ Vector ∙ Matrix ∙ Simple scalar ∙ Simple array ∙ Nested array ∙ Cell ∙ Major cell ∙ Subarray ∙ Empty array ∙ Prototype |
Data types | Number (Boolean, Complex number) ∙ Character (String) ∙ Box ∙ Namespace ∙ Function array |
Concepts and paradigms | Conformability (Scalar extension, Leading axis agreement) ∙ Scalar function (Pervasion) ∙ Identity element ∙ Complex floor ∙ Array ordering (Total) ∙ Tacit programming (Function composition, Close composition) ∙ Glyph ∙ Leading axis theory ∙ Major cell search ∙ First-class function |
Errors | LIMIT ERROR ∙ RANK ERROR ∙ SYNTAX ERROR ∙ DOMAIN ERROR ∙ LENGTH ERROR ∙ INDEX ERROR ∙ VALUE ERROR ∙ EVOLUTION ERROR |