Variant
Variant (⍠
, ⎕OPT
) or Custom (:
in A Dictionary of APL[1]) and Fit in J, is a special dyadic operator which takes a function as its left operand and modifies its behaviour as specified by the array right operand.
Since <syntaxhighlight lang=apl inline>⍠</source> was not in Dyalog's atomic vector when the feature was added, a system operator alternative was provided in form of <syntaxhighlight lang=apl inline>⎕OPT</source>.
History
Variant dates back all the way to Iverson notation where a subscript was used to indicate which index origin a primitive would operate under. This system was dropped in APL\360. Instead, the system command <syntaxhighlight lang=apl inline>)ORIGIN</source> was provided for controlling the interpreter's global setting. This was then supplemented with a system variable to control the global state. Though this feature is still present in many APL systems, together with numerous other system variables for controlling other aspects of the system, for example comparison tolerance, these global settings were recognised as an unfortunate design in that every programmer would be forced to set and localise every system variable that could affect the given code. Later, Ken Iverson envisioned a return to a per-invocation setting, similar to the original notation, but this time in the form of a dyadic operator that would customise primitive functions.
Although SHARP APL didn't implement Iverson's idea, J did. Later Dyalog APL 13.0 (2011) repurposed it as a way of providing auxiliary arguments to primitive and system functions, and functions derived from primitive and system operators, however its only current use in connection with primitives is to provide language settings for the Format Date-time I-beam (<syntaxhighlight lang=apl inline>1200⌶</source>).[2]
Usage
The Dyalog system operator <syntaxhighlight lang=apl inline>⎕S</source> takes as operands text to be searched for, and what to return for each match (with &
meaning the matched text):
<syntaxhighlight lang=apl>
('abra'⎕S'&')'Abrabrabra' abra
</source>
Only one match is found, because <syntaxhighlight lang=apl inline>⎕S</source> defaults to being case sensitive and disallow overlapping matches. The variant operator can be used to enable case insensitivity: <syntaxhighlight lang=apl>
('abra'⎕S'&'⍠1)'Abrabrabra' Abra abra
</source>
This usage with a simple scalar right operand is in line with Iverson's design: <syntaxhighlight lang=j>
1 = 1+1e_14 NB. equivalent to 1 = 1+1e¯14 in Dictionary APL
1
1 (= !. 0) 1+1e_14 NB. equivalent to 1 (= : 0) 1+1e¯14 in Dictionary APL
0
</source>
However, Dyalog also allows a name–value pair, or a vector of name–value pairs. The above example can be spelled using the <syntaxhighlight lang=apl inline>IC</source> (for Ignore Case) setting name: <syntaxhighlight lang=apl>
('abra'⎕S'&'⍠'IC'1)'Abrabrabra' Abra abra
</source>
Multiple settings can either be specified with multiple applications of variant, or by using a vector of name–value pairs. Here, <syntaxhighlight lang=apl inline>OM</source> (for Overlapping Matches) is enabled in addition to <syntaxhighlight lang=apl inline>IC</source>: <syntaxhighlight lang=apl>
('abra'⎕S'&'⍠'IC'1⍠'OM'1)'Abrabrabra' Abra abra abra ('abra'⎕S'&'⍠('IC'1)('OM'1))'Abrabrabra' Abra abra abra
</source>
External links
Tutorials
Documentation
References
- ↑ Ken Iverson. A Dictionary of APL. Custom. APL Quote Quad, Volume 18, Number 1, 1987-09.
- ↑ Dyalog Ltd. Language Reference Guide: Format Date-time.