Dyalog APL versions
Dyalog APL is released in numbered versions, with approximately one version per year. Each release version is classified as a major (.0) or minor (point) release, depending on whether the major version number is incremented. Major versions are more likely to introduce new features and may spend longer in development.
Version 13.0 was released in April 2011. It featured extensive changes to the language including support for complex and decimal float numeric types, identity function primitives, support for regular expressions, extensions to existing primitives, and new idioms.
Support for complex numbers including numeric literal notation such as
3J4, arithmetic and circle functions, and tolerant comparisons Equal and Not Equal (but not array ordering: total array ordering including ordering of complex numbers was added in 17.0). While almost all changes were backwards compatible, backwards compatibility in the Power function was broken: fractional powers of negative numbers, such as
¯8 * ÷3, could return different results.
Support was added for 128-bit decimal floating point numbers (from IEEE 754-2008), using the densely packed decimal (DPD) format internally. The system variable
⎕FR (Floating point Representation) was added, with the options 645 for 64-bit binary (5) floats and 1287 for 128-bit decimal (7) floats. Because of the increased precision of decfs, an additional system variable
⎕DCT was added to control comparison tolerance with decfs enabled, with the default value
⎕FR is 645,
⎕CT controls the comparison tolerance, but when it is 1287,
⎕DCT controls comparison tolerance. Support for interfacing with .NET decimal floats was also added. Because no complex decimal float type was added, version 13.1 broke Dyalog APL's strict numeric type hierarchy, introducing potential changes in precision when placing values together in an array.
⊣ (Same, Left) and
⊢ (Same, Right) were introduced. Monadic
+, formerly called Identity, was changed to Conjugate (a change which did not break backwards compatibility, because prior to the introduction of complex numbers the two functions were indistinguishable). Dyadic functions Take (
↑), Drop (
↓), and Index (
⌷) were extended to allow short left arguments, matching SHARP APL's interpretation of the leading axis theory.
A primitive operator (
⍠) was introduced as an alternative spelling of the existing system operator Variant (
⎕OPT), with a functionality similar to one sketched by Ken Iverson (
:) and implemented in J (
The Index Generator function was changed so that
⍳⍬ would return
⊂⍬ rather than
⎕IO. The former behaviour was considered a bug because
⎕IO is not a valid index into an array with empty shape (that is, a scalar).
⎕R were added to perform regex search and replace, respectively. The system function
⎕RSI (Reference Space Indicator) was implemented to return references to the namespaces from which functions were called:
⎕RSI is identical to
⎕NSI but returns namespace references instead of string names. System function
⎕PROFILE was added for line-level profiling of APL applications.
Dyalog's Input Method Editor (IME), used to control keyboard layouts, was redesigned.
Idiom recognition was improved: the append idiom
,← was extended and a new append idiom
⍪← was added, as well as a new join idiom
⍪/. Tack-reduce idioms
⊢/ to obtain the first or last major cell of an array, or the first or last column of a matrix, were added. Euler's idiom
*○, producing a unit complex number, was also added.
Version 13.1 was released in April 2012.
Error messages were extended with the potential for additional information beyond the type of error. The system variable
⎕DMX (Diagnostic Message eXtended) was added to access this information programmatically, as well as a help URL and the source code location corresponding to the error. The system function
⎕FHIST, to access information about a file's history (such as time of creation), was also added.
New random number generators were added: the Mersenne twister algorithm, and querying the operating system. The algorithm could be selected with I-beam
16807⌶. Support was added for Enlist in selective assignment.
Version 13.2 was released in January 2013. It included GUI improvements, a new Array Editor, and minor improvements in the language and implementation.
Performance of reductions, scans, and stranding was improved. In particular, stranding and the scans
⍲\ were all improved asymptotically, from to time in the length of the argument or number of stranded arrays.
Version 14.0 was released in June 2014. It featured extensive changes to the Dyalog APL language as well as its implementation.
Under the direction of Roger Hui, who had been hired by Dyalog Ltd. in 2011, several features adapted from J were added. Version 14.0 began the adoption in Dyalog APL of array programming's leading axis model, with built-ins Tally (
≢), Key (
⌸), and the Rank operator (
⍤). Function trains, another J feature, were also introduced. Of these, Rank differs from J's definition because it does not allow complete leading axis agreement—instead, two arguments must have identical frames or one frame must be empty—and Key has an added monadic case, and differs in that the operand is passed a left argument indicating the unique element used.
Further changes were made in conjunction with the introduction of Rank and leading axis theory. Index Of was extended (as in J) to allow a left argument of rank greater than 1, searching major cells of the left argument. Mix was extended to increase the rank of each element in its argument to a common rank, rather than giving a RANK ERROR if they had unequal ranks. This change brought the behavior of Mix into alignment with the result array combination used by the Rank operator and Key. An unrelated change was to extend Mix with axis to allow the axis to be a vector indicating the final positions of each axis of the argument elements (rather than only a singleton indicating the position of the first axis). This change was made to apply only with a migration level setting of at least 2; it was extended to all migration levels in version 18.0.
This version allowed monadic operators to be manipulated more easily: beginning in 14.0, they can be named, grouped with parentheses, and displayed in the session. It also introduced a new way to form a monadic operator called right operand currying: a dyadic operator along with an operand to its right produces a derived operator. These changes did not extend to naming, parenthesizing, or displaying dyadic operators, nor to binding a left operant to a dyadic operator.
Performance improvements to existing features were focused on Boolean arrays but also included work on indexing and scans. A new I-beam,
8⌶, was introduced to allow fast lookups on inverted tables, paralleling the extension to Index Of to allow lookups on non-inverted tables.
The default migration level was changed from 0 to 1, with the effect that monadic
∊ indicates Enlist rather than Type by default. The default random link was changed to use the Mersenne Twister algorithm rather than a linear congruential generator. Additionally, the assignment
⎕RL←0 was introduced to initialize random number generation with a seed taken from the operating system (which therefore differs between different APL instances).
Version 15.0 was released in June 2016. It added platform-independent portable file functions (
⎕NPARTS) and improved support for using APL source code from text files. It also added I-beams for case conversion and creating hashed arrays which behave identically to normal arrays but have faster performance when searched with set functions including Index-Of (
⍳) and Membership (
Dyalog was made free for personal and non-commercial use starting in version 15.0.
The following new primitive functions and operators were added:
- Where (
- Interval Index (
- Nest (
- Partition (
⊆), another way to write a function which was previously only accessible with migration level 3
- At operator (
- Stencil (
Additionally, system functions
⎕CSV were added to import and export data in common formats. Some JSON support was already present; 16.0 promoted it to a system function.
Significant performance improvements were made in structural and selective functions such as Transpose, Catenate, Take, Rotate, and Reverse, and other primitives including Enlist, Encode, and Decode. Work on Dyalog's bytecode compiler was significantly reduced relative to 15.0, a trend which continued with almost no development on the compiler done in 17.0 and later.
Version 17.0 was released in July 2018. It features significant work on tools for using APL and interfacing with other languages, as well as performance, and a relatively small number of new language features.
Total array ordering (TAO) was added in version 17.0, making it the first APL implementation to order entire arrays rather than cells of a single array. This allows Grade Up (
⍋), Grade down (
⍒), and Interval Index (
⍸) to work on nested arrays. Additionally, Unique (
∪) was extended to allow an argument of any rank by removing duplicate major cells.
17.0 featured improvements to the HTML-based session environment RIDE, and a preliminary version of Link, which was fully released in 17.1. It also improved the positioning of the session's error caret: prior to 17.0 the caret usually pointed to a position further left than the source of an error, while in 17.0 and later it almost always points to the actual primitive or named function or operator which emitted the error, or the beginning of the derived function which did.
Support for packaging APL code as a shared library (for instance a .so or .dll file) for use by other languages was added.
Portable file function support was improved, with changes including new functions
⎕NMOVE to copy and move files.
Version 17.0 implemented substantial performance improvements in many areas. The most important improvements were better use of vector instructions including support for ARM NEON and AVX2 and vectorised comparison functions, simplification of trivial cases for functions, improved Boolean algorithms, and improvements to Replicate, Expand, and Where.
Version 17.1 was released in October 2019, shortly after the Dyalog '19 user meeting. It contains few new features and almost no performance changes. The primary changes to the language were to add the Link system using
]LINK, allow running Dyalog through docker containers, and improve cross-platform support for HTMLRenderer. Additionally, Dyalog's licensing was changed to allow non-commercial users to download and run it for free, without applying for a non-commercial license from Dyalog.
Version 18.0 is currently planned for release in 2020. It was developed in parallel with version 17.1, which had very few new features, and includes several new primitives and extensions to existing primitives.
The following new primitive functions and operators are added:
- Unique Mask (
- Atop operator (
⍤), sharing a symbol with Rank
- Over operator (
- Constant operator (
⍨), sharing a symbol with Commute
Integers greater than 1 are now allowed in the right argument of Where (
⍸), matching the definition of the corresponding primitive function in other APLs. A related extension allows integers greater than 1 in the left argument of Partitioned Enclose (
⊂), which produce empty partitions in the output. The extension to Partitioned Enclose makes it the first APL partitioning function which can produce empty partitions.
Version 18.0 allows multi-line input in the session using the line editor, and allows control structures to be used in the session. Multi-line input is begun when a dfn, namespace, class, or control structure is begun but not finished on the same line. It also allows syntax colouring and editing multi-line blocks in the session.
New system functions for case folding and mapping (
⎕C) and date-time conversion are added.
|APL dialects |
|Maintained||APL+Win (APL*PLUS) ∙ APL2 ∙ APL64 ∙ APL\iv ∙ Co-dfns ∙ Dyalog APL ∙ dzaima/APL ∙ GNU APL ∙ NARS2000 ∙ ngn/apl|
|Historical||Iverson notation ∙ A Programming Language ∙ A+ (A) ∙ APL# ∙ APL.68000 ∙ APL.SV ∙ APLX ∙ APL\1130 ∙ APL\360 ∙ NARS ∙ openAPL ∙ Rowan ∙ SHARP APL (SAX) ∙ VisualAPL (APLNext) ∙ VSAPL ∙ York APL|
|Derivatives||ELI ∙ J ∙ K (Q, KDB+) ∙ LYaPAS ∙ Nial ∙ RAD|