Ambivalent function: Difference between revisions

Jump to navigation Jump to search
m (Text replacement - "<source" to "<syntaxhighlight")
m (Text replacement - "</source>" to "</syntaxhighlight>")
 
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]]; <syntaxhighlight 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; <syntaxhighlight 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]], <syntaxhighlight lang=apl inline>900⌶⍬</source>.<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>
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 <syntaxhighlight lang=apl inline>⍺</source>. (This is in contrast with [[dop]]s which have a fixed [[operator valence]] determined by the presence of an unquoted <syntaxhighlight lang=apl inline>⍵⍵</source> in their code.) Like tradfns, the dfn can check the name class (<syntaxhighlight 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 <syntaxhighlight 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 > [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>⍺</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!]
Line 19: Line 19:
     ⍵ * ÷⍺
     ⍵ * ÷⍺
}
}
</source>
</syntaxhighlight>


We can also define the [[Over]] operator with <syntaxhighlight 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!]
Line 29: Line 29:
     (⍵⍵ ⍺) ⍺⍺ (⍵⍵ ⍵)
     (⍵⍵ ⍺) ⍺⍺ (⍵⍵ ⍵)
}
}
</source>
</syntaxhighlight>


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