Mix: Difference between revisions

Jump to navigation Jump to search
5,404 bytes added ,  10:21, 1 May 2020
Mainly history and sorting out all the different definitions
m (Text replacement - "{{APL built-ins}}" to "{{APL built-ins}}Category:Primitive functions")
(Mainly history and sorting out all the different definitions)
Line 1: Line 1:
{{Built-ins|Mix|↑|⊃}} is a [[monadic function]].
:''This page describes the function that combines the contents of all its argument's elements. For the function that gives the contents of only a single element (called Disclose in some nested APLs), see [[First]].''
 
{| class=vertical-navbox style="float:right; font-size:500%; margin:0 1ex;"
|<code>↑</code> <code>⊃</code> <code>></code>
|}
'''Mix''' (<code>↑</code> or <code>⊃</code> in [[Nested array model|nested]] APLs; '''Disclose''' or '''Open''' <code>></code> in [[Flat array model|flat]] array languages) is a [[primitive function|primitive]] [[monadic function]] which reduces the [[depth]] of its [[argument]] by combining all its [[element]] arrays into a single array. The [[shape]] of its result is then the shape of the argument followed by the common shape of the argument elements. Depending on the definition of Mix, the elements may be required to share the same shape, or they may be extended in shape (with [[fill element]]s) or rank to fit a common shape. In all APLs Mix allows a [[simple array]] argument, and returns it unchanged. Mix is a left inverse to both [[Enclose]] and [[Split]], while the function [[First]], which is identical to Mix on [[scalar]]s, is a left inverse to [[Enclose]] only.
 
== History ==
 
Early experiments in array nesting usually defined a primitive to extract the contents of a nested [[scalar]], but did not always specify how it should behave on an array. [[Jim Brown]]'s "A Generalization of APL",<ref>[[Jim Brown]]. [http://www.softwarepreservation.org/projects/apl/Books/AGENERALIZATIONOFAPL "A Generalization of APL"] (Ph.D. thesis). 1971.</ref> which would become [[APL2]], defined such a primitive, "reveal", while stating that it "may be undefined" on non-scalar arrays.
 
Mix (<source lang=apl inline>↑</source>) was first introduced by [[NARS]] in 1981.<ref>Carl M. Cheney. [http://www.sudleyplace.com/APL/Nested%20Arrays%20System.pdf ''APL*PLUS Nested Arrays System''] ([[NARS]] reference manual). [[STSC]]. 1981.</ref> It required all elements to have matching shape, and allowed a [[Function axis|specified axis]] to define where in the result array their axes would be placed. In the same year, [[SHARP APL]] introduced the concept of a [[box]]ed array, along with the function Disclose (<source lang=apl inline>></source>).<ref>[[Ken Iverson]]. SATN-41: [https://www.jsoftware.com/papers/satn41.htm Composition and Enclosure]. [[IPSA]]. 1981-06-20.</ref> In SHARP, Disclose was simply defined to be the inverse of Enclose, but given [[function rank]] 0 so that it would disclose each box in an argument and combine the results. Based on SHARP's definition of [[Rank (operator)|Rank]], the arrays to be combined were required to have the same [[shape]], and because of its [[flat array model]], they also had to have the same type (numeric, character, or boxed), as otherwise the result array would not be representable.
 
[[APL2]], released in 1984, used the same name Disclose as SHARP APL but introduced the glyph <source lang=apl inline>⊃</source>. It shared NARS's [[function axis]] definition, but extended the function to allow argument elements with different [[shape]]s as long as they had the same [[rank]]. Arrays with different shapes would be padded using [[fill element]]s as with [[Take]] to bring them to a common shape large enough to contain every element.
 
A further extension was introduced as a consequence of [[J]]'s definition of the [[Rank operator]]. In J, result arrays in a function applied with rank can have different [[rank]]s, and results with lower rank are brought to a common rank by adding leading 1s to the shape. This change was taken up by [[Dyalog APL]] in [[Dyalog APL 14.0|version 14.0]], which introduced [[Rank (operator)|Rank]] following J's definition, in order to make Mix and Rank consistent. However, Dyalog differs from J in that it permits [[mixed array]]s, so while in J an array containing a mix of numbers, characters, and boxes cannot be mixed, in Dyalog any array at all can be mixed.
 
== Language support ==
 
Mix is only available in languages which allow nesting, either by [[box]]es or [[nested array]]s, so it is not present in early APLs such as [[APL\360]] and [[APL.SV]].
 
{|class=wikitable
! Languages              !! Name    !! [[Glyph]]      !! Requirements      !! [[Function axis]]
|-
| [[NARS]], [[NARS2000]] || Mix     || <code></code> || [[Shape]]          || {{Yes}}
|-
| [[SHARP APL]], [[A+]]  || Disclose || <code>></code> || [[Shape]] and type || {{No}}
|-
| [[APL2]], [[APLX]]    || Disclose || <code></code> || [[Rank]]          || {{Yes}}
|-
| [[Dyalog APL]]        || Mix      || <code>↑</code> or <code>⊃</code> ([[Migration level|ML]]) || None || {{Yes}}
|-
| [[J]]                  || Open    || <code>></code> || Type              || {{No}}
|-
| [[ngn/apl]]            || Mix      || <code>↑</code> || None              || {{No}}
|-
| [[dzaima/APL]]        || Merge    || <code>↑</code> || [[Rank]]          || {{No}}
|}
 
== External links ==
 
=== Lessons ===
 
* [https://chat.stackexchange.com/transcript/52405?m=41304486#41304486 APL Cultivation]
 
=== Documentation ===
 
* [https://help.dyalog.com/18.0/#Language/Primitive%20Functions/Mix.htm Dyalog]
* [http://microapl.com/apl_help/ch_020_020_600.htm APLX]
* [[J]] [https://www.jsoftware.com/help/dictionary/d020.htm dictionary], [https://code.jsoftware.com/wiki/Vocabulary/gt NuVoc]
 
== References ==
<references/>


{{APL built-ins}}[[Category:Primitive functions]]
{{APL built-ins}}[[Category:Primitive functions]]

Navigation menu