Under: Difference between revisions

Jump to navigation Jump to search
144 bytes added ,  10:41, 11 September 2022
m
Text replacement - "<source" to "<syntaxhighlight"
m (Text replacement - "<source" to "<syntaxhighlight")
Tags: Mobile edit Mobile web edit
Line 1: Line 1:
{{Built-in|Under|⍢}}, or '''Dual''' (<source lang=apl inline>¨</source>), is a [[primitive operator|primitive]] [[dyadic operator]] which takes two [[function]] [[operand]]s. It pre-processes its argument(s) with the monadic right operand, before applying the left operand on/between the result(s), then undoing the pre-processing.<ref>[https://mlochbaum.github.io/BQN/help/under.html BQN: Circle Jot (⌾)]</ref>
{{Built-in|Under|⍢}}, or '''Dual''' (<syntaxhighlight lang=apl inline>¨</source>), is a [[primitive operator|primitive]] [[dyadic operator]] which takes two [[function]] [[operand]]s. It pre-processes its argument(s) with the monadic right operand, before applying the left operand on/between the result(s), then undoing the pre-processing.<ref>[https://mlochbaum.github.io/BQN/help/under.html BQN: Circle Jot (⌾)]</ref>


== Model ==
== Model ==
In dialects that support user-defined operators and invertible functions, it can be defined as (or similar):
In dialects that support user-defined operators and invertible functions, it can be defined as (or similar):
<source lang=apl>      _U_ ← {⍺←{⍵ ⋄ ⍺⍺} ⋄ ⍵⍵⍣¯1⊢(⍵⍵ ⍺)⍺⍺(⍵⍵ ⍵)}</source>
<syntaxhighlight lang=apl>      _U_ ← {⍺←{⍵ ⋄ ⍺⍺} ⋄ ⍵⍵⍣¯1⊢(⍵⍵ ⍺)⍺⍺(⍵⍵ ⍵)}</source>


== Examples ==
== Examples ==
The following example solves [https://leetcode.com/problems/add-two-numbers/ a LeetCode problem] which asks to add two numbers given as reversed digit lists:
The following example solves [https://leetcode.com/problems/add-two-numbers/ a LeetCode problem] which asks to add two numbers given as reversed digit lists:
<source lang=apl>
<syntaxhighlight lang=apl>


       2 4 3 +_U_(10⊥⌽) 5 6 4
       2 4 3 +_U_(10⊥⌽) 5 6 4
Line 15: Line 15:
== Close composition ==
== Close composition ==


In [[SHARP APL]] and [[J]], Under is implemented as a [[close composition]], meaning that (using SHARP syntax) <source lang=apl inline>f¨g</source> has the overall [[function rank]] of <source lang=apl inline>g</source>. This allows <source lang=apl inline>¨></source> to serve the purpose of [[Each]] from a [[Nested array model|nested]] APL. J uses <source lang=j inline>&.</source> for the close form and <source lang=j inline>&.:</source> for the rankless form.
In [[SHARP APL]] and [[J]], Under is implemented as a [[close composition]], meaning that (using SHARP syntax) <syntaxhighlight lang=apl inline>f¨g</source> has the overall [[function rank]] of <syntaxhighlight lang=apl inline>g</source>. This allows <syntaxhighlight lang=apl inline>¨></source> to serve the purpose of [[Each]] from a [[Nested array model|nested]] APL. J uses <syntaxhighlight lang=j inline>&.</source> for the close form and <syntaxhighlight lang=j inline>&.:</source> for the rankless form.


== History ==
== History ==


The most widely known form of Under for much of APL's history was [[SHARP APL]]'s Dual operator, written <source lang=apl inline>¨</source> and defined as a [[close composition]]. It was presented by [[Ken Iverson]] and [[Bob Bernecky]] with the name "with" in 1980,<ref>[[Bob Bernecky]] and [[Ken Iverson]]. [https://www.jsoftware.com/papers/opea.htm Operators and Enclosed Arrays] at [[IPSA '80]]</ref> and implemented for only a small number of right operands in 1981.<ref>[https://www.jsoftware.com/papers/satn41.htm "Composition and Enclosure"]. SATN-41, 1981-06-20.</ref> The name "Dual" was used in [[Rationalized APL]] in 1983, and the full SHARP implementation using [[function rank]] was completed just after.<ref>[https://www.jsoftware.com/papers/satn45.htm "Language Extensions of May 1983"]. SATN-45, 1983-05-02.</ref> Iverson changed the name to Under for his 1987 [[A Dictionary of APL]], and [[J]] uses this name as well. It includes both a close form <source lang=j inline>&.</source> like SHARP and a non-close form <source lang=j inline>&.:</source>.
The most widely known form of Under for much of APL's history was [[SHARP APL]]'s Dual operator, written <syntaxhighlight lang=apl inline>¨</source> and defined as a [[close composition]]. It was presented by [[Ken Iverson]] and [[Bob Bernecky]] with the name "with" in 1980,<ref>[[Bob Bernecky]] and [[Ken Iverson]]. [https://www.jsoftware.com/papers/opea.htm Operators and Enclosed Arrays] at [[IPSA '80]]</ref> and implemented for only a small number of right operands in 1981.<ref>[https://www.jsoftware.com/papers/satn41.htm "Composition and Enclosure"]. SATN-41, 1981-06-20.</ref> The name "Dual" was used in [[Rationalized APL]] in 1983, and the full SHARP implementation using [[function rank]] was completed just after.<ref>[https://www.jsoftware.com/papers/satn45.htm "Language Extensions of May 1983"]. SATN-45, 1983-05-02.</ref> Iverson changed the name to Under for his 1987 [[A Dictionary of APL]], and [[J]] uses this name as well. It includes both a close form <syntaxhighlight lang=j inline>&.</source> like SHARP and a non-close form <syntaxhighlight lang=j inline>&.:</source>.


However, Iverson had defined the Dual operator with glyph <source lang=apl inline>⍢</source> in his 1978 paper [[Operators and Functions]],<ref>[[Ken Iverson]]. [https://www.jsoftware.com/papers/opfns.htm ''Operators and Functions''], §8 Composition and Duality. IBM Research Report #RC7091. 1978-04-26.</ref> using a non-close form because [[function rank]] had not yet been invented. [[NARS]] featured this operator in 1981, preceding SHARP's limited implementation. [[Roger Hui]] proposed Under with the same definition as a potential addition to [[Dyalog APL]] at [[Dyalog '15]], and it was added to both [[Extended Dyalog APL]] and [[dzaima/APL]] in 2018.
However, Iverson had defined the Dual operator with glyph <syntaxhighlight lang=apl inline>⍢</source> in his 1978 paper [[Operators and Functions]],<ref>[[Ken Iverson]]. [https://www.jsoftware.com/papers/opfns.htm ''Operators and Functions''], §8 Composition and Duality. IBM Research Report #RC7091. 1978-04-26.</ref> using a non-close form because [[function rank]] had not yet been invented. [[NARS]] featured this operator in 1981, preceding SHARP's limited implementation. [[Roger Hui]] proposed Under with the same definition as a potential addition to [[Dyalog APL]] at [[Dyalog '15]], and it was added to both [[Extended Dyalog APL]] and [[dzaima/APL]] in 2018.


Structural Under was developed by [[Marshall Lochbaum]] around 2017,<ref>[[Marshall Lochbaum]]. [https://mlochbaum.github.io/BQN/commentary/history.html#structural-under BQN's development history: Structural Under].</ref> and was included in Extended Dyalog initially and added to dzaima/APL in 2020. Later [[dzaima]] would implement <source lang=apl inline>⍢×</source> and <source lang=apl inline>⍢|</source> in the same spirit, now featured in dzaima/APL and [[dzaima/BQN]]. The language [[BQN]] has included structural and computational Under, using the glyph <code>⌾</code>, since its initial design in 2020.
Structural Under was developed by [[Marshall Lochbaum]] around 2017,<ref>[[Marshall Lochbaum]]. [https://mlochbaum.github.io/BQN/commentary/history.html#structural-under BQN's development history: Structural Under].</ref> and was included in Extended Dyalog initially and added to dzaima/APL in 2020. Later [[dzaima]] would implement <syntaxhighlight lang=apl inline>⍢×</source> and <syntaxhighlight lang=apl inline>⍢|</source> in the same spirit, now featured in dzaima/APL and [[dzaima/BQN]]. The language [[BQN]] has included structural and computational Under, using the glyph <code>⌾</code>, since its initial design in 2020.


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


* [[J]]: <source lang=j inline>&.</source> [https://code.jsoftware.com/wiki/Vocabulary/ampdot NuVoc], [https://www.jsoftware.com/help/dictionary/d631.htm dictionary]; <source lang=j inline>&.:</source> [https://code.jsoftware.com/wiki/Vocabulary/ampdotco NuVoc], [https://www.jsoftware.com/help/dictionary/d631c.htm dictionary]
* [[J]]: <syntaxhighlight lang=j inline>&.</source> [https://code.jsoftware.com/wiki/Vocabulary/ampdot NuVoc], [https://www.jsoftware.com/help/dictionary/d631.htm dictionary]; <syntaxhighlight lang=j inline>&.:</source> [https://code.jsoftware.com/wiki/Vocabulary/ampdotco NuVoc], [https://www.jsoftware.com/help/dictionary/d631c.htm dictionary]
* [https://mlochbaum.github.io/BQN/doc/under.html BQN]
* [https://mlochbaum.github.io/BQN/doc/under.html BQN]


Navigation menu