System Labels: Difference between revisions
No edit summary |
No edit summary |
||
(One intermediate revision by the same user not shown) | |||
Line 1: | Line 1: | ||
<p>Normally, execution of an [[Anonymous_Functions/Operators|Anonymous Function/Operator]] ( | <p>Normally, execution of an [[Anonymous_Functions/Operators/Hyperators|Anonymous Function/Operator/Hyperator]] (AFOH) or User-Defined Function/Operator/Hyperator (UDFOH) 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 13: | Line 13: | ||
<tr> | <tr> | ||
<td valign="top"><apll>⎕INV:</apll></td> | |||
<td></td> | |||
<td></td> | |||
<td>is called when an inverse function is needed as in <apll>foo⍣¯1 R</apll>.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top"><apll>⎕MS:</apll></td> | <td valign="top"><apll>⎕MS:</apll></td> | ||
<td></td> | <td></td> | ||
<td></td> | <td></td> | ||
<td>is called when an | <td>is called when an AFOH/UDFOH is invoked by the [[Multisets|Multiset Operator]] as in <apll>foo⍦R</apll>.</td> | ||
</tr> | </tr> | ||
Line 30: | Line 37: | ||
</table> | </table> | ||
<br /> | <br /> | ||
<p>For example, as a | <p>For example, as a UDFOH</p> | ||
<apll><pre> | <apll><pre> | ||
Line 36: | Line 43: | ||
[1] Z←L,R ⋄ →0 | [1] Z←L,R ⋄ →0 | ||
[2] ⎕ID :Z←'Identity' ,(⎕NC 'L'),(⎕NC 'R') ⋄ →0 | [2] ⎕ID :Z←'Identity' ,(⎕NC 'L'),(⎕NC 'R') ⋄ →0 | ||
[3] ⎕MS :Z←'Multiset' ,(⎕NC 'L'),(⎕NC 'R') ⋄ →0 | [3] ⎕INV:Z←'Inverse' ,(⎕NC 'L'),(⎕NC 'R') ⋄ →0 | ||
[ | [4] ⎕MS :Z←'Multiset' ,(⎕NC 'L'),(⎕NC 'R') ⋄ →0 | ||
[5] ⎕PRO:Z←'Prototype',(⎕NC 'L'),(⎕NC 'R') ⋄ →0 | |||
∇ | ∇ | ||
</pre></apll> | </pre></apll> | ||
or equivalently as an | or equivalently as an AFOH | ||
<apll><pre> | <apll><pre> | ||
Line 47: | Line 55: | ||
<span style="color:blue;">➥</span>0:⍺←0 ⋄ ⍺,⍵ | <span style="color:blue;">➥</span>0:⍺←0 ⋄ ⍺,⍵ | ||
<span style="color:blue;">➥</span>⋄ ⎕ID :'Identity' ,(⎕NC '⍺'),⎕NC '⍵' | <span style="color:blue;">➥</span>⋄ ⎕ID :'Identity' ,(⎕NC '⍺'),⎕NC '⍵' | ||
<span style="color:blue;">➥</span>⋄ ⎕INV:'Inverse' ,(⎕NC '⍺'),⎕NC '⍵' | |||
<span style="color:blue;">➥</span>⋄ ⎕MS :'Multiset' ,(⎕NC '⍺'),⎕NC '⍵' | <span style="color:blue;">➥</span>⋄ ⎕MS :'Multiset' ,(⎕NC '⍺'),⎕NC '⍵' | ||
<span style="color:blue;">➥</span>⋄ ⎕PRO:'Prototype',(⎕NC '⍺'),⎕NC '⍵'} | <span style="color:blue;">➥</span>⋄ ⎕PRO:'Prototype',(⎕NC '⍺'),⎕NC '⍵'} | ||
)BOX ON | |||
Was OFF | |||
foo/⍬ | |||
┌──────────────┐ | ┌──────────────┐ | ||
│┌8───────────┐│ | │┌8───────────┐│ | ||
Line 59: | Line 70: | ||
{⍺+÷⍵ ⋄ ⎕ID:∞}\7⍴1 | {⍺+÷⍵ ⋄ ⎕ID:∞}\7⍴1 | ||
1 2 1.5 1.666666667 1.6 1.625 1.615384615 | 1 2 1.5 1.666666667 1.6 1.625 1.615384615 | ||
foo⍣¯1 1 | |||
┌9───────────┐ | |||
│ Inverse 0 2│ | |||
└+───────────┘ | |||
foo⍦ 1 | foo⍦ 1 | ||
Multiset 0 2 | Multiset 0 2 | ||
2 foo⍦ 1 | 2 foo⍦ 1 | ||
Multiset 2 2 | Multiset 2 2 | ||
1 foo¨⍬ | |||
┌0──────────────┐ | ┌0──────────────┐ | ||
│┌11───────────┐│ | │┌11───────────┐│ | ||
Line 75: | Line 92: | ||
</pre></apll> | </pre></apll> | ||
* <p>In the Identity element case, the | * <p>In the Identity element case, the AFOH/UDFOH is called with the Reduction function's right argument '''prototype''' as the right argument to the AFOH/UDFOH; 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 AFOH/UDFOH 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 Inverse case, the AFOH/UDFOH is called with the same argument(s) as the Inverse-derived function.</p> | |||
* <p>In the Multiset case, the | * <p>In the Multiset case, the AFOH/UDFOH 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 AFOH/UDFOH 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, which needs both a Prototype and Identity element), a <apll>NONCE ERROR</apll> is signaled. Eventually, this case will be handled by placing all appropriate System Labels on the same line as in <apll>⎕ID:⎕PRO:</apll>.</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. |
Latest revision as of 19:53, 18 September 2022
Normally, execution of an Anonymous Function/Operator/Hyperator (AFOH) or User-Defined Function/Operator/Hyperator (UDFOH) 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 UDFOH
∇ Z←{L} foo R [1] Z←L,R ⋄ →0 [2] ⎕ID :Z←'Identity' ,(⎕NC 'L'),(⎕NC 'R') ⋄ →0 [3] ⎕INV:Z←'Inverse' ,(⎕NC 'L'),(⎕NC 'R') ⋄ →0 [4] ⎕MS :Z←'Multiset' ,(⎕NC 'L'),(⎕NC 'R') ⋄ →0 [5] ⎕PRO:Z←'Prototype',(⎕NC 'L'),(⎕NC 'R') ⋄ →0 ∇
or equivalently as an AFOH
foo←{ ➥0:⍺←0 ⋄ ⍺,⍵ ➥⋄ ⎕ID :'Identity' ,(⎕NC '⍺'),⎕NC '⍵' ➥⋄ ⎕INV:'Inverse' ,(⎕NC '⍺'),⎕NC '⍵' ➥⋄ ⎕MS :'Multiset' ,(⎕NC '⍺'),⎕NC '⍵' ➥⋄ ⎕PRO:'Prototype',(⎕NC '⍺'),⎕NC '⍵'} )BOX ON Was OFF foo/⍬ ┌──────────────┐ │┌8───────────┐│ ││Identity 0 2││ │└────────────┘2 └∊─────────────┘ {⍺+÷⍵ ⋄ ⎕ID:∞}/⍬ ∞ {⍺+÷⍵ ⋄ ⎕ID:∞}\7⍴1 1 2 1.5 1.666666667 1.6 1.625 1.615384615 foo⍣¯1 1 ┌9───────────┐ │ Inverse 0 2│ └+───────────┘ foo⍦ 1 Multiset 0 2 2 foo⍦ 1 Multiset 2 2 1 foo¨⍬ ┌0──────────────┐ │┌11───────────┐│ ││ 0 0││ │└─────────────┘2 └∊──────────────┘ foo/¨0⍴⊂⍬ NONCE ERROR foo/¨0⍴⊂⍬ ∧
In the Identity element case, the AFOH/UDFOH is called with the Reduction function's right argument prototype as the right argument to the AFOH/UDFOH; 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 AFOH/UDFOH 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 Inverse case, the AFOH/UDFOH is called with the same argument(s) as the Inverse-derived function.
In the Multiset case, the AFOH/UDFOH is called with the same argument(s) as the Multiset-derived function.
In the Prototype case, the AFOH/UDFOH 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, which needs both a Prototype and Identity element), a NONCE ERROR is signaled. Eventually, this case will be handled by placing all appropriate System Labels on the same line as in ⎕ID:⎕PRO:.
- 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.