Ambivalent function: Difference between revisions

Jump to navigation Jump to search
207 bytes added ,  22:17, 10 September 2022
m
Text replacement - "</source>" to "</syntaxhighlight>"
No edit summary
m (Text replacement - "</source>" to "</syntaxhighlight>")
 
(4 intermediate revisions by the same user not shown)
Line 5: Line 5:
=== Tradfns ===
=== Tradfns ===


In some APLs, for example [[APL*PLUS]], [[tradfn]]s that declare a left argument in the [[function header]] are always ambivalent, and the code needs to check whether a left argument was supplied by the left argument name's [[name class]]; <source lang=apl inline>0 ≠ ⎕NC 'leftArg'</source>. Other APLs, for example [[Dyalog APL]], will not allow calling such a function monadically, unless the header has curly braces around the left argument name to indicate that it is optional; <source lang=apl inline> result ← {leftArg} FnName rightArg</source>. Then too, they need to query the name class, or, unique for Dyalog APL, use a specialised ''Called Monadically'' [[I-beam]], <source lang=apl inline>900⌶⍬</source>.<ref>[[Dyalog APL]] Language Reference Guide > The I-Beam Operator > [http://help.dyalog.com/latest/#Language/Primitive%20Operators/Called%20Monadically.htm Called Monadically]</ref>
In some APLs, for example [[APL*PLUS]], [[tradfn]]s that declare a left argument in the [[function header]] are always ambivalent, and the code needs to check whether a left argument was supplied by the left argument name's [[name class]]; <syntaxhighlight lang=apl inline>0 ≠ ⎕NC 'leftArg'</syntaxhighlight>. Other APLs, for example [[Dyalog APL]], will not allow calling such a function monadically, unless the header has curly braces around the left argument name to indicate that it is optional; <syntaxhighlight lang=apl inline> result ← {leftArg} FnName rightArg</syntaxhighlight>. Then too, they need to query the name class, or, unique for Dyalog APL, use a specialised ''Called Monadically'' [[I-beam]], <syntaxhighlight lang=apl inline>900⌶⍬</syntaxhighlight>.<ref>[[Dyalog APL]] Language Reference Guide > The I-Beam Operator > [https://help.dyalog.com/latest/#Language/I%20Beam%20Functions/Called%20Monadically.htm Called Monadically]</ref>


=== Dfns ===
=== Dfns ===


[[Dfn]]s are always ambivalent, even if they reference <source lang=apl inline>⍺</source>. (This is in contrast with [[dop]]s which have a fixed [[operator valence]] determined by the presence of an unquoted <source lang=apl inline>⍵⍵</source> in their code.) Like tradfns, the dfn can check the name class (<source lang=apl inline>0 ≠ ⎕NC '⍺'</source>).
[[Dfn]]s are always ambivalent, even if they reference <syntaxhighlight lang=apl inline>⍺</syntaxhighlight>. (This is in contrast with [[dop]]s which have a fixed [[operator valence]] determined by the presence of an unquoted <syntaxhighlight lang=apl inline>⍵⍵</syntaxhighlight> in their code.) Like tradfns, the dfn can check the name class (<syntaxhighlight lang=apl inline>0 ≠ ⎕NC '⍺'</syntaxhighlight>).


However, most APLs that support dfns also allow a statement of the structure <source lang=apl inline>⍺ ← defaultValue</source> which skipped if the function was called dyadically.<ref>[[Dyalog APL]] Programming Reference Guide > Defined Functions & Operators > Direct Functions & Operators > [http://help.dyalog.com/latest/#Language/Defined%20Functions%20and%20Operators/DynamicFunctions/Default%20Left%20Argument.htm Default Left Argument]</ref> This syntax also allows assigning a function, or even an operator, to <source lang=apl inline>⍺</source>, thus streamlining many ambivalent definitions. For example, we can create a Nth root function which defaults to being the square root when used monadically:
However, most APLs that support dfns also allow a statement of the structure <syntaxhighlight lang=apl inline>⍺ ← defaultValue</syntaxhighlight> which skipped if the function was called dyadically.<ref>[[Dyalog APL]] Programming Reference Guide > Defined Functions & Operators > Direct Functions & Operators > [https://help.dyalog.com/latest/#Language/Defined%20Functions%20and%20Operators/DynamicFunctions/Default%20Left%20Argument.htm Default Left Argument]</ref> This syntax also allows assigning a function, or even an operator, to <syntaxhighlight lang=apl inline>⍺</syntaxhighlight>, thus streamlining many ambivalent definitions. For example, we can create a Nth root function which defaults to being the square root when used monadically:


[https://tio.run/##SyzI0U2pTMzJT///Pyg/v@RR24RqLgUgeNS7C8g2grK3KmgpHN4OFOOqhahTMDQw4DJWADONzAE Try it online!]
[https://tio.run/##SyzI0U2pTMzJT///Pyg/v@RR24RqLgUgeNS7C8g2grK3KmgpHN4OFOOqhahTMDQw4DJWADONzAE Try it online!]
<source lang=apl>
<syntaxhighlight lang=apl>
Root←{
Root←{
     ⍺←2
     ⍺←2
     ⍵ * ÷⍺
     ⍵ * ÷⍺
}
}
</source>
</syntaxhighlight>


We can also define the [[Over]] operator with <source lang=apl inline>⍺</source> defaulting to be an operator that skips its operand:
We can also define the [[Over]] operator with <syntaxhighlight lang=apl inline>⍺</syntaxhighlight> defaulting to be an operator that skips its operand:


[https://tio.run/##SyzI0U2pTMzJT///378stehR24RqLgUgeNS7C8R@1LtV4VF3C5jbu6sWLKUBFASL9@7ShEogiW3V5Kr9/19XAWSagsbh6Y96V2gqGHOZKqAJmQAA Try it online!]
[https://tio.run/##SyzI0U2pTMzJT///378stehR24RqLgUgeNS7C8R@1LtV4VF3C5jbu6sWLKUBFASL9@7ShEogiW3V5Kr9/19XAWSagsbh6Y96V2gqGHOZKqAJmQAA Try it online!]
<source lang=apl>
<syntaxhighlight lang=apl>
Over←{
Over←{
     ⍺←{⍵ ⋄ ⍺⍺}
     ⍺←{⍵ ⋄ ⍺⍺}
     (⍵⍵ ⍺) ⍺⍺ (⍵⍵ ⍵)
     (⍵⍵ ⍺) ⍺⍺ (⍵⍵ ⍵)
}
}
</source>
</syntaxhighlight>


== External links ==
== External links ==
Line 36: Line 36:
=== Documentation ===
=== Documentation ===
* [http://microapl.com/apl_help/ch_020_010_070.htm APLX]
* [http://microapl.com/apl_help/ch_020_010_070.htm APLX]
* [https://help.dyalog.com/latest/#Language/Defined%20Functions%20and%20Operators/Model%20Syntax.htm Dyalog]
* [https://help.dyalog.com/latest/#Language/Defined%20Functions%20and%20Operators/TradFns/Model%20Syntax.htm Dyalog]


== References ==
== References ==

Navigation menu