Comparison of APL dialects: Difference between revisions
(Embed Omnibar) |
(Table of various Discloses (which also serves for boxed vs nested)) |
||
Line 4: | Line 4: | ||
One of the most significant differences between APLs is the choice of [[array model]], namely [[Nested array theory|nested]] or [[Flat array theory|flat]]. Originally, all APLs were entirely flat, that is, the only [[scalar]] values supported were [[simple]] and had to be either [[number]]s and [[character]]s, and an array had to be homogeneous, that is, consisting entirely of a single [[type]]. [[SHARP APL]] introduced the [[box]] as a third type, such that a box could hold any other array (including a box array), and this allowed for arrays contain other arrays. [[NARS]] introduced the nested array model, where any arrays can be an actual [[element]] of another array. Most currently maintained dialects ([[Dyalog APL]], [[NARS2000]], [[APL2]], [[GNU APL]], and others) use the nested array model. | One of the most significant differences between APLs is the choice of [[array model]], namely [[Nested array theory|nested]] or [[Flat array theory|flat]]. Originally, all APLs were entirely flat, that is, the only [[scalar]] values supported were [[simple]] and had to be either [[number]]s and [[character]]s, and an array had to be homogeneous, that is, consisting entirely of a single [[type]]. [[SHARP APL]] introduced the [[box]] as a third type, such that a box could hold any other array (including a box array), and this allowed for arrays contain other arrays. [[NARS]] introduced the nested array model, where any arrays can be an actual [[element]] of another array. Most currently maintained dialects ([[Dyalog APL]], [[NARS2000]], [[APL2]], [[GNU APL]], and others) use the nested array model. | ||
=== Disclose === | |||
[[Disclose]] is defined, on [[scalar]]s, to be the inverse of [[Enclose]], giving the sole [[element]] of that scalar. This behavior is extended to arbitrary arrays in one of two ways: [[Mix]], which combines all elements, and [[First]], which returns only the first (in [[ravel order]]). | |||
In the [[SHARP APL]] family, Disclose is written <syntaxhighlight lang=apl inline>></syntaxhighlight>, and given a [[function rank]] of 0, which causes it to behave as [[Mix]]. [[First]] is not a primitive. | |||
In nested APL dialects, Disclose is written <syntaxhighlight lang=apl inline>⊃</syntaxhighlight>, and it [[Disclose#History|was extended]] to First by [[NARS]] and to Mix by [[APL2]]. The other possible meaning is given the glyph <syntaxhighlight lang=apl inline>↑</syntaxhighlight> and named "Mix" or "First" (not "Disclose") as appropriate. Dialects might choose either assignment of glyphs, and [[Dyalog APL]] and [[APL*PLUS]] allow either to be chosen based on [[Migration Level]]. | |||
{|class=wikitable | |||
! Glyph !! Meaning !! Dialects | |||
|- | |||
| <syntaxhighlight lang=apl inline>></syntaxhighlight> || [[Mix]] || [[SHARP APL]], [[A]], [[A+]] | |||
|- | |||
| <syntaxhighlight lang=apl inline>⊃</syntaxhighlight> || [[Mix]] || [[APL2]], [[APLX]], [[NARS2000]], [[GNU APL]], [[Kap]] | |||
|- | |||
| <syntaxhighlight lang=apl inline>⊃</syntaxhighlight> || [[First]] || [[ngn/apl]], [[Co-dfns]], [[dzaima/APL]], [[April]] | |||
|- | |||
| <syntaxhighlight lang=apl inline>⊃</syntaxhighlight> || Configurable || [[Dyalog APL]], [[APL*PLUS]], [[APL+Win]], [[APL64]] | |||
|} | |||
== Complex numbers == | == Complex numbers == | ||
Most dialects support [[complex number]]s, but some ([[dzaima/APL]], [[APLX]], [[APL+Win]]) don't. Dialects with complex numbers also extend [[Circular]] (<syntaxhighlight lang=apl inline>○</syntaxhighlight>) to left arguments designed for complex numbers. | Most dialects support [[complex number]]s, but some ([[dzaima/APL]], [[APLX]], [[APL+Win]]) don't. Dialects with complex numbers also extend [[Circular]] (<syntaxhighlight lang=apl inline>○</syntaxhighlight>) to left arguments designed for complex numbers. | ||
== Depth == | == Depth == |
Revision as of 21:43, 19 February 2024
All APL dialects share core features, and at least the primitives are backwards compatible with those of APL.SV. However, there are important dialectal differences, the most significant of which are described in this article.
Flat versus Nested
One of the most significant differences between APLs is the choice of array model, namely nested or flat. Originally, all APLs were entirely flat, that is, the only scalar values supported were simple and had to be either numbers and characters, and an array had to be homogeneous, that is, consisting entirely of a single type. SHARP APL introduced the box as a third type, such that a box could hold any other array (including a box array), and this allowed for arrays contain other arrays. NARS introduced the nested array model, where any arrays can be an actual element of another array. Most currently maintained dialects (Dyalog APL, NARS2000, APL2, GNU APL, and others) use the nested array model.
Disclose
Disclose is defined, on scalars, to be the inverse of Enclose, giving the sole element of that scalar. This behavior is extended to arbitrary arrays in one of two ways: Mix, which combines all elements, and First, which returns only the first (in ravel order).
In the SHARP APL family, Disclose is written >
, and given a function rank of 0, which causes it to behave as Mix. First is not a primitive.
In nested APL dialects, Disclose is written ⊃
, and it was extended to First by NARS and to Mix by APL2. The other possible meaning is given the glyph ↑
and named "Mix" or "First" (not "Disclose") as appropriate. Dialects might choose either assignment of glyphs, and Dyalog APL and APL*PLUS allow either to be chosen based on Migration Level.
Glyph | Meaning | Dialects |
---|---|---|
> |
Mix | SHARP APL, A, A+ |
⊃ |
Mix | APL2, APLX, NARS2000, GNU APL, Kap |
⊃ |
First | ngn/apl, Co-dfns, dzaima/APL, April |
⊃ |
Configurable | Dyalog APL, APL*PLUS, APL+Win, APL64 |
Complex numbers
Most dialects support complex numbers, but some (dzaima/APL, APLX, APL+Win) don't. Dialects with complex numbers also extend Circular (○
) to left arguments designed for complex numbers.
Depth
Dyalog APL defines Depth (≡
) to return negative numbers when the depth is uneven. Most other dialects instead define it to return the maximum depth. The original NARS paper assigned the glyph to a function called Simple, which simply answered if the argument was simple or not, without reporting the actual depth. It was thus equivalent to today's 1=≡,Y
.
External links
- Omnibar lists all glyphs with their meanings and allows custom comparisons between dialects:
APL dialects [edit] | |
---|---|
Maintained | APL+Win ∙ APL2 ∙ APL64 ∙ APL\iv ∙ Aplette ∙ April ∙ Co-dfns ∙ Dyalog APL ∙ Dyalog APL Vision ∙ dzaima/APL ∙ GNU APL ∙ Kap ∙ NARS2000 ∙ Pometo ∙ TinyAPL |
Historical | A Programming Language ∙ A+ (A) ∙ APL# ∙ APL2C ∙ APL\360 ∙ APL/700 ∙ APL\1130 ∙ APL\3000 ∙ APL.68000 ∙ APL*PLUS ∙ APL.jl ∙ APL.SV ∙ APLX ∙ Extended Dyalog APL ∙ Iverson notation ∙ IVSYS/7090 ∙ NARS ∙ ngn/apl ∙ openAPL ∙ Operators and Functions ∙ PAT ∙ Rowan ∙ SAX ∙ SHARP APL ∙ Rationalized APL ∙ VisualAPL (APLNext) ∙ VS APL ∙ York APL |
Derivatives | AHPL ∙ BQN ∙ CoSy ∙ ELI ∙ Glee ∙ I ∙ Ivy ∙ J ∙ Jelly ∙ K (Goal, Klong, Q) ∙ KamilaLisp ∙ Lang5 ∙ Lil ∙ Nial ∙ RAD ∙ Uiua |
Overviews | Comparison of APL dialects ∙ Timeline of array languages ∙ Timeline of influential array languages ∙ Family tree of array languages |