Under: Difference between revisions

From APL Wiki
Jump to navigation Jump to search
(→‎History: Oh it was in NARS too)
Line 14: Line 14:
The Dual operator, written <code>¨</code>, appeared in 1983 both in [[Rationalized APL]] and [[SHARP APL]]<ref>[https://www.jsoftware.com/papers/satn45.htm "Language Extensions of May 1983"]. SATN-45, 1983-05-02.</ref> just after. In both cases it was defined to be a [[close composition]], so that the overall function has the rank of the right operand; this allows <code>¨></code> to serve the purpose of [[Each]] from a [[Nested array model|nested]] APL. 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 Dual operator, written <code>¨</code>, appeared in 1983 both in [[Rationalized APL]] and [[SHARP APL]]<ref>[https://www.jsoftware.com/papers/satn45.htm "Language Extensions of May 1983"]. SATN-45, 1983-05-02.</ref> just after. In both cases it was defined to be a [[close composition]], so that the overall function has the rank of the right operand; this allows <code>¨></code> to serve the purpose of [[Each]] from a [[Nested array model|nested]] APL. 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>.


However, [[Ken 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. [[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.
However, [[Ken 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. [[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.


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

Revision as of 16:38, 25 April 2022

Under (), or Dual (¨), is a primitive dyadic operator which takes two function operands. 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.[1]

Model

In dialects that support user-defined operators and invertible functions, it can be defined as (or similar):

       _U_ ← {⍺←{⍵ ⋄ ⍺⍺} ⋄ ⍵⍵⍣¯1⊢(⍵⍵ ⍺)⍺⍺(⍵⍵ ⍵)}

Examples

https://leetcode.com/problems/add-two-numbers/
      2 4 3 +_U_(10⊥⌽) 5 6 4
7 0 8

History

The Dual operator, written ¨, appeared in 1983 both in Rationalized APL and SHARP APL[2] just after. In both cases it was defined to be a close composition, so that the overall function has the rank of the right operand; this allows ¨> to serve the purpose of Each from a nested APL. 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 &. like SHARP and a non-close form &.:.

However, Ken Iverson had defined the Dual operator with glyph in his 1978 paper "Operators and Functions",[3] using a non-close form because function rank had not yet been invented. NARS featured this operator in 1981. 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,[4] and was included in Extended Dyalog initially and added to dzaima/APL in 2020. Later dzaima would implement ⍢× and ⍢| in the same spirit, now featured in dzaima/APL and dzaima/BQN. The language BQN has included structural and computational Under, using the glyph , since its initial design in 2020.

External links

References

  1. BQN: Circle Jot (⌾)
  2. "Language Extensions of May 1983". SATN-45, 1983-05-02.
  3. Ken Iverson. Operators and Functions, §8 Composition and Duality. IBM Research Report #RC7091. 1978-04-26.
  4. Marshall Lochbaum. BQN's development history: Structural Under.
APL built-ins [edit]
Primitives (Timeline) Functions
Scalar
Monadic ConjugateNegateSignumReciprocalMagnitudeExponentialNatural LogarithmFloorCeilingFactorialNotPi TimesRollTypeImaginarySquare Root
Dyadic AddSubtractTimesDivideResiduePowerLogarithmMinimumMaximumBinomialComparison functionsBoolean functions (And, Or, Nand, Nor) ∙ GCDLCMCircularComplexRoot
Non-Scalar
Structural ShapeReshapeTallyDepthRavelEnlistTableCatenateReverseRotateTransposeRazeMixSplitEncloseNestCut (K)PairLinkPartitioned EnclosePartition
Selection FirstPickTakeDropUniqueIdentityStopSelectReplicateExpandSet functions (IntersectionUnionWithout) ∙ Bracket indexingIndexCartesian ProductSort
Selector Index generatorGradeIndex OfInterval IndexIndicesDealPrefix and suffix vectors
Computational MatchNot MatchMembershipFindNub SieveEncodeDecodeMatrix InverseMatrix DivideFormatExecuteMaterialiseRange
Operators Monadic EachCommuteConstantReplicateExpandReduceWindowed ReduceScanOuter ProductKeyI-BeamSpawnFunction axis
Dyadic BindCompositions (Compose, Reverse Compose, Beside, Withe, Atop, Over) ∙ Inner ProductDeterminantPowerAtUnderRankDepthVariantStencilCutDirect definition (operator)
Quad names Index originComparison toleranceMigration levelAtomic vector