System Labels: Difference between revisions
mNo edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
<p>Normally, execution of | <p>Normally, execution of an [[Anonymous_Functions/Operators|Anonymous Function/Operator]] (AFO) or User-Defined Function/Operator (UDFO) starts execution at line one. However, in certain contexts, execution may start at a different place depending upon the context and the presence of a <b>System Label</b>. These special labels start with a quad symbol so as to distinguish them from normal labels. The following table lists the system labels defined so far and the special context in which they are used.</p> | ||
<table border="1" cellpadding="5" cellspacing="0" rules="none" summary=""> | <table border="1" cellpadding="5" cellspacing="0" rules="none" summary=""> | ||
Line 16: | Line 16: | ||
<td></td> | <td></td> | ||
<td></td> | <td></td> | ||
<td>is called when | <td>is called when an AFO/UDFO is invoked by the [[Multisets|Multiset Operator]].</td> | ||
</tr> | </tr> | ||
Line 30: | Line 30: | ||
</table> | </table> | ||
<br /> | <br /> | ||
<p>For example,</p> | <p>For example, as a UDFO</p> | ||
<apll> ∇ Z←{L} foo R<br /> | <apll> ∇ Z←{L} foo R<br /> | ||
Line 39: | Line 39: | ||
∇<br /></apll> | ∇<br /></apll> | ||
<apll> ⎕fmt foo/⍬<br /> | or equivalently as an AFO | ||
<apll> foo←{<br /> | |||
<span style="color:blue;">➥</span>0:⍺←0 ⋄ ⍺,⍵<br /> | |||
<span style="color:blue;">➥</span>⋄ ⎕ID :'Identity' ,(⎕NC '⍺'),⎕NC '⍵'<br /> | |||
<span style="color:blue;">➥</span>⋄ ⎕MS :'Multiset' ,(⎕NC '⍺'),⎕NC '⍵'<br /> | |||
<span style="color:blue;">➥</span>⋄ ⎕PRO:'Prototype',(⎕NC '⍺'),⎕NC '⍵'}<br /> | |||
⎕fmt foo/⍬<br /> | |||
┌──────────────┐<br /> | ┌──────────────┐<br /> | ||
│┌8───────────┐│<br /> | │┌8───────────┐│<br /> | ||
Line 45: | Line 52: | ||
│└────────────┘2<br /> | │└────────────┘2<br /> | ||
└∊─────────────┘<br /> | └∊─────────────┘<br /> | ||
{⍺+÷⍵ ⋄ ⎕ID:∞}/⍬<br /> | |||
∞<br /> | |||
{⍺+÷⍵ ⋄ ⎕ID:∞}\7⍴1<br /> | |||
1 2 1.5 1.666666667 1.6 1.625 1.615384615<br /> | |||
foo⍦ 1<br /> | foo⍦ 1<br /> | ||
Multiset 0 2<br /> | Multiset 0 2<br /> | ||
Line 60: | Line 71: | ||
∧</apll> | ∧</apll> | ||
* <p>In the Identity element case, the | * <p>In the Identity element case, the AFO/UDFO is called with the Reduction function's right argument '''prototype''' as the right argument to the AFO/UDFO; the left argument is undefined. For example, in <apll>foo/3 0⍴⊂⍳4</apll>, the (right) argument passed to the <apll>⎕ID:</apll> entry point is <apll>0 0 0 0</apll>. The return value from the AFO/UDFO is used as the common item in the result. Thus, the <apll>⎕ID</apll> entry point is called only once even though the result may have multiple copies of the return value.</p> | ||
* <p>In the Multiset case, the | * <p>In the Multiset case, the AFO/UDFO is called with the same argument(s) as the Multiset derived function.</p> | ||
* <p>In the Prototype case, the | * <p>In the Prototype case, the AFO/UDFO is called with arguments that are the '''prototypes''' of the respective arguments; in the monadic case, the left argument is undefined.</p> | ||
* <p>For the moment, if two or more system labels would be called at the same time (such as the last example above), a <apll>NONCE ERROR</apll> is signaled.</p> | * <p>For the moment, if two or more system labels would be called at the same time (such as the last example above), a <apll>NONCE ERROR</apll> is signaled.</p> | ||
* This idea was taken from the paper by David A. Rabenhorst, "[http://portal.acm.org/citation.cfm?id=801228 APL function variants and system labels]", ACM SIGAPL APL Quote Quad, APL83, Volume 13, Issue 3 (March 1983), pp. 281-284. | * This idea was taken from the paper by David A. Rabenhorst, "[http://portal.acm.org/citation.cfm?id=801228 APL function variants and system labels]", ACM SIGAPL APL Quote Quad, APL83, Volume 13, Issue 3 (March 1983), pp. 281-284. |
Revision as of 17:18, 20 April 2017
Normally, execution of an Anonymous Function/Operator (AFO) or User-Defined Function/Operator (UDFO) starts execution at line one. However, in certain contexts, execution may start at a different place depending upon the context and the presence of a System Label. These special labels start with a quad symbol so as to distinguish them from normal labels. The following table lists the system labels defined so far and the special context in which they are used.
|
For example, as a UDFO
∇ Z←{L} foo R
[1] Z←L,R ⋄ →0
[2] ⎕ID :Z←'Identity' ,(⎕NC 'L'),(⎕NC 'R') ⋄ →0
[3] ⎕MS :Z←'Multiset' ,(⎕NC 'L'),(⎕NC 'R') ⋄ →0
[4] ⎕PRO:Z←'Prototype',(⎕NC 'L'),(⎕NC 'R') ⋄ →0
∇
or equivalently as an AFO
foo←{
➥0:⍺←0 ⋄ ⍺,⍵
➥⋄ ⎕ID :'Identity' ,(⎕NC '⍺'),⎕NC '⍵'
➥⋄ ⎕MS :'Multiset' ,(⎕NC '⍺'),⎕NC '⍵'
➥⋄ ⎕PRO:'Prototype',(⎕NC '⍺'),⎕NC '⍵'}
⎕fmt foo/⍬
┌──────────────┐
│┌8───────────┐│
││Identity 0 2││
│└────────────┘2
└∊─────────────┘
{⍺+÷⍵ ⋄ ⎕ID:∞}/⍬
∞
{⍺+÷⍵ ⋄ ⎕ID:∞}\7⍴1
1 2 1.5 1.666666667 1.6 1.625 1.615384615
foo⍦ 1
Multiset 0 2
2 foo⍦ 1
Multiset 2 2
⎕fmt 1 foo¨⍬
┌0──────────────┐
│┌11───────────┐│
││ 0 0││
│└─────────────┘2
└∊──────────────┘
foo/¨0⍴⊂⍬
NONCE ERROR
foo/¨0⍴⊂⍬
∧
In the Identity element case, the AFO/UDFO is called with the Reduction function's right argument prototype as the right argument to the AFO/UDFO; the left argument is undefined. For example, in foo/3 0⍴⊂⍳4, the (right) argument passed to the ⎕ID: entry point is 0 0 0 0. The return value from the AFO/UDFO is used as the common item in the result. Thus, the ⎕ID entry point is called only once even though the result may have multiple copies of the return value.
In the Multiset case, the AFO/UDFO is called with the same argument(s) as the Multiset derived function.
In the Prototype case, the AFO/UDFO is called with arguments that are the prototypes of the respective arguments; in the monadic case, the left argument is undefined.
For the moment, if two or more system labels would be called at the same time (such as the last example above), a NONCE ERROR is signaled.
- This idea was taken from the paper by David A. Rabenhorst, "APL function variants and system labels", ACM SIGAPL APL Quote Quad, APL83, Volume 13, Issue 3 (March 1983), pp. 281-284.