Function axis: Difference between revisions

Jump to navigation Jump to search
3,092 bytes added ,  22:20, 10 September 2022
m
Text replacement - "<source" to "<syntaxhighlight"
Miraheze>Marshall
(Remove name "Bracket Axis" and explain derived functions with axis)
m (Text replacement - "<source" to "<syntaxhighlight")
(9 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Built-in|Function axis|[ax]}} is a special syntax which modifies the behavior of a function, for example <source lang=apl inline>⌽[2]</source> to [[Rotate]] along the second [[axis]]. Axis specification was a feature of [[Iverson notation]] and was ubiquitous in early APLs; many newer APLs which adhere to [[leading axis theory]] reject the use of axis specification in favor of the [[Rank operator]] because it is a fully general operator while the behavior of functions with axis must be defined for each function separately.
{{Built-in|Function axis|[ax]}} is a special syntax which modifies the behavior of a function, for example <syntaxhighlight lang=apl inline>⌽[2]</syntaxhighlight> to [[Rotate]] along the second [[axis]]. Axis specification was a feature of [[Iverson notation]] and was ubiquitous in early APLs; many newer APLs which adhere to [[leading axis theory]] reject the use of axis specification in favor of the [[Rank operator]] because it is a fully general operator while the behavior of functions with axis must be defined for each function separately. However, [[GNU APL]] implements the syntax and extends it so it applies to all user-defined functions.


== Functions ==
== Functions ==
Line 11: Line 11:
=== Dyadic functions ===
=== Dyadic functions ===
The following [[Dyadic function|dyads]] may allow one:
The following [[Dyadic function|dyads]] may allow one:
* [[Scalar dyadics]] accept a list of axes to override [[conformability]] rules: it specifies , for each axis in the lower-rank (or left, in case of a tie) argument, which axis in the other argument it is paired with.
* [[Scalar function|Scalar]] [[dyadic]]s accept a list of axes to override [[conformability]] rules: it specifies , for each axis in the lower-rank (or left, in case of a tie) argument, which axis in the other argument it is paired with.
* [[Catenate]] combines along the selected axis, adding a new axis if a non-integer axis is given.
* [[Catenate]] combines along the selected axis, adding a new axis if a non-integer axis is given.
* [[Rotate]] rotates the right argument along the selected axis.
* [[Rotate]] rotates the right argument along the selected axis.
* [[Replicate]] and [[Expand]] work on the specified right argument axis.
* [[Replicate]] and [[Expand]] work on the specified right argument axis.
* [[Take]] and [[Drop]] modify the selected right argument axes.
* [[Take]] and [[Drop]] modify the selected right argument axes.
* [[Squish]] takes axes to specify which axis of the right argument corresponds to each left argument element.
* [[Squad indexing]] takes axes to specify which axis of the right argument corresponds to each left argument element.
* [[Partition]] and [[Partitioned Enclose]] have complicated and different behavior.
* [[Partition]] and [[Partitioned Enclose]] have complicated and different behavior.


Line 27: Line 27:


Axis specification always modifies the [[derived function]] obtained from an operator, and not the operator itself. The exact syntax may vary: in most cases a set of brackets is parsed like a monadic operator and applies directly to the derived function; sometimes brackets can be applied directly to an operator, in which case the derived function produced by this operator is modified. In [[Dyalog APL]], a slash with axis retains its [[function-operator overloading]]: it can be applied as an operator or as a dyadic function ([[Replicate]] or [[Expand]]).
Axis specification always modifies the [[derived function]] obtained from an operator, and not the operator itself. The exact syntax may vary: in most cases a set of brackets is parsed like a monadic operator and applies directly to the derived function; sometimes brackets can be applied directly to an operator, in which case the derived function produced by this operator is modified. In [[Dyalog APL]], a slash with axis retains its [[function-operator overloading]]: it can be applied as an operator or as a dyadic function ([[Replicate]] or [[Expand]]).
== Generalisation ==
GNU APL generalises function axis to all functions, and beyond cases that refer to one or more argument axes. The axis works like an additional argument, which the function can use in any way. For example, <syntaxhighlight lang=apl inline>⌹[ax] M</syntaxhighlight> computes the [[wikipedia:QR factorization|QR factorization]] of <syntaxhighlight lang=apl inline>M</syntaxhighlight> with the [[comparison tolerance]] of <syntaxhighlight lang=apl inline>ax</syntaxhighlight>. Here, <syntaxhighlight lang=apl inline>ax</syntaxhighlight> is not an axis at all, and there's no direct connection between this monadic usage of Domino and its non-axis meaning of [[Matrix inverse]]. Thus there is no value for <syntaxhighlight lang=apl inline>ax</syntaxhighlight> such that <syntaxhighlight lang=apl inline>f[ax]</syntaxhighlight> is the same as <syntaxhighlight lang=apl inline>f</syntaxhighlight>, which is usually the case for existing axis definitions (not scalar functions). Much like the left argument of [[Circular]] (<syntaxhighlight lang=apl inline>○</syntaxhighlight>), The GNU APL specific File Input Output [[system function]] (<syntaxhighlight lang=apl inline>⎕FIO</syntaxhighlight>) uses the bracket axis syntax as a function selector, as does the [[wikipedia:SQL|SQL]] interface function (<syntaxhighlight lang=apl inline>⎕SQL</syntaxhighlight>). Some of the options for <syntaxhighlight lang=apl inline>⎕SQL</syntaxhighlight> take additional parameters as subsequent elements of the array inside the brackets. Similarly, the [[wikipedia:regular expression|regular expression]] interface (<syntaxhighlight lang=apl inline>⎕RE</syntaxhighlight>) uses [[character]] "axes" as flags for the regular expression engine, where [[Dyalog APL]] uses a [[dyadic operator]], [[Variant]] (<syntaxhighlight lang=apl inline>⍠</syntaxhighlight>), for analogous functionality.
GNU APL additionally gives user-defined functions, both [[dfn]]s and [[tradfn]]s, access to the bracket axis syntax, again while permitting its use for any purpose. For example, the [[root]] function could be implemented as a monadic function with axis specifying the degree, rather than as a dyadic function. In a dfn, the value given via axis notation is denoted <syntaxhighlight lang=apl inline>χ</syntaxhighlight>:
<syntaxhighlight lang=apl>
      Root←{⍵*÷χ}
      Root[3]8
2
</syntaxhighlight>
{{Works in|[[GNU APL]]}}
Or as a tradfn, indicating axis notation in the header line:
<syntaxhighlight lang=apl>
∇ r←Root[ax] y
  r←y*÷ax
</syntaxhighlight>
{{Works in|[[GNU APL]]}}


== External links ==
== External links ==


=== Documentation ===
=== Documentation ===
* [https://help.dyalog.com/latest/index.htm#Language/Primitive%20Operators/Operators%20Summarised.htm Dyalog]
* Dyalog: [https://help.dyalog.com/latest/index.htm#Language/Primitive%20Operators/Operators%20Summarised.htm overview], [https://help.dyalog.com/latest/index.htm#Language/Primitive%20Operators/Axis%20with%20Monadic%20Operand.htm monadic], [https://help.dyalog.com/latest/index.htm#Language/Primitive%20Operators/Axis%20with%20Dyadic%20Operand.htm dyadic]
* [http://microapl.com/apl_help/ch_020_010_020.htm APLX]
* [http://microapl.com/apl_help/ch_020_010_020.htm APLX]
* [https://www.gnu.org/software/apl/apl.html#Section-2_002e2 GNU APL]
=== Lesson ===
=== Lesson ===
* [https://chat.stackexchange.com/rooms/52405/conversation/lesson-3-some-apl-operators-----#message-40898783 APL Cultivation]
* [https://chat.stackexchange.com/rooms/52405/conversation/lesson-3-some-apl-operators-----#message-40898783 APL Cultivation]
 
{{APL syntax}}[[Category:Function characteristics]]
{{APL programming language}}

Navigation menu