Dyalog APL versions: Difference between revisions

From APL Wiki
Jump to navigation Jump to search
m (Reverted edits by Adám Brudzewsky (talk) to last revision by Marshall)
Tag: Rollback
m (Text replacement - "<source" to "<syntaxhighlight")
Line 5: Line 5:
Version 10.0 was released March 2003. It incorporated aspects of [[.NET]] support that had been part of Dyalog.NET, as well as other miscellaneous improvements to the language, interface, and performance.
Version 10.0 was released March 2003. It incorporated aspects of [[.NET]] support that had been part of Dyalog.NET, as well as other miscellaneous improvements to the language, interface, and performance.


The new constant value <source lang=apl inline>⎕NULL</source> was added for better integration with .NET. Another new [[system function]], <source lang=apl inline>⎕NLOCK</source>, was added for file locking support. Two features were added to <source lang=apl inline>:For</source> loops: the <source lang=apl inline>:InEach</source> [[keyword]] for iterating simultaneously along several arrays, and automatic handling of [[.NET]] COM collections.
The new constant value <syntaxhighlight lang=apl inline>⎕NULL</source> was added for better integration with .NET. Another new [[system function]], <syntaxhighlight lang=apl inline>⎕NLOCK</source>, was added for file locking support. Two features were added to <syntaxhighlight lang=apl inline>:For</source> loops: the <syntaxhighlight lang=apl inline>:InEach</source> [[keyword]] for iterating simultaneously along several arrays, and automatic handling of [[.NET]] COM collections.


This release added keyword completion (AutoCompletion) and syntax colouring in the [[session]]. New performance features were added: [[Idiom recognition|recognised idioms]] were combinations of tokens supported by special code, and binding a search function ([[Index of]] or [[Membership]]) to its principal argument invoked the new retained hash table mechanism, saving the work of creating a hash table for that argument every time the search function was called after the first. The APLScript mechanism, allowing source files to be converted to workspaces for distribution, was also added. The resulting executables could be distributed with a copy of Dyalog APL in library form.
This release added keyword completion (AutoCompletion) and syntax colouring in the [[session]]. New performance features were added: [[Idiom recognition|recognised idioms]] were combinations of tokens supported by special code, and binding a search function ([[Index of]] or [[Membership]]) to its principal argument invoked the new retained hash table mechanism, saving the work of creating a hash table for that argument every time the search function was called after the first. The APLScript mechanism, allowing source files to be converted to workspaces for distribution, was also added. The resulting executables could be distributed with a copy of Dyalog APL in library form.
Line 13: Line 13:
Version 10.1 was released July 2004. It allowed [[tradfn]] arguments and results to be composed of multiple variables (much like [[stranding]]) and featured improved thread handling, including a token pool mechanism for synchronisation. In preparation for the upcoming 64-bit release in version 11.0, it added support for 64-bit [[component file]]s, which increased the 4GB limit on component file sizes imposed by 32-bit files.
Version 10.1 was released July 2004. It allowed [[tradfn]] arguments and results to be composed of multiple variables (much like [[stranding]]) and featured improved thread handling, including a token pool mechanism for synchronisation. In preparation for the upcoming 64-bit release in version 11.0, it added support for 64-bit [[component file]]s, which increased the 4GB limit on component file sizes imposed by 32-bit files.


[[System function]]s <source lang=apl inline>⎕TPUT</source> and <source lang=apl inline>⎕TGET</source> were added to manage threads, along with the system variable <source lang=apl inline>⎕TPOOL</source> and function <source lang=apl inline>⎕TREQ</source> to report on existing threads and requests. The current thread name can be found with the new system function <source lang=apl inline>⎕TNAME</source>.
[[System function]]s <syntaxhighlight lang=apl inline>⎕TPUT</source> and <syntaxhighlight lang=apl inline>⎕TGET</source> were added to manage threads, along with the system variable <syntaxhighlight lang=apl inline>⎕TPOOL</source> and function <syntaxhighlight lang=apl inline>⎕TREQ</source> to report on existing threads and requests. The current thread name can be found with the new system function <syntaxhighlight lang=apl inline>⎕TNAME</source>.


File handling system functions such as <source lang=apl inline>⎕FCREATE</source> were extended to allow 0 as an input tie number, to indicate that the smallest available tie number should be used (0 is not a valid option). The release also featured further improvements to the [[session]] such as filename completion for workspace commands.
File handling system functions such as <syntaxhighlight lang=apl inline>⎕FCREATE</source> were extended to allow 0 as an input tie number, to indicate that the smallest available tie number should be used (0 is not a valid option). The release also featured further improvements to the [[session]] such as filename completion for workspace commands.


== 11.0 ==
== 11.0 ==
Line 23: Line 23:
Version 11.0 was released October 2006, and was released for both 32- and 64-bit systems—Dyalog's first 64-bit release aside from a much earlier [[wikipedia:DEC Alpha|DEC Alpha]] release. It introduced [[object-oriented programming]] extensions designed to work like [[.NET]] and based technologically on the existing [[namespace]]s. The primary new features were classes, instances (objects), and interfaces, supporting inheritance, access control, and constructors and destructors. Instances could be placed in arrays, and [[empty]] arrays could store the class of an instance in the [[prototype]]. When instantiated (for instance by taking the [[First]] element of an empty array), a prototype object would be created using the class's [[niladic]] constructor, if present. Classes could interact with namespaces by importing their functions as methods. Dyalog's Windows GUI framework, already based on .NET classes, was integrated with the new Dyalog classes.
Version 11.0 was released October 2006, and was released for both 32- and 64-bit systems—Dyalog's first 64-bit release aside from a much earlier [[wikipedia:DEC Alpha|DEC Alpha]] release. It introduced [[object-oriented programming]] extensions designed to work like [[.NET]] and based technologically on the existing [[namespace]]s. The primary new features were classes, instances (objects), and interfaces, supporting inheritance, access control, and constructors and destructors. Instances could be placed in arrays, and [[empty]] arrays could store the class of an instance in the [[prototype]]. When instantiated (for instance by taking the [[First]] element of an empty array), a prototype object would be created using the class's [[niladic]] constructor, if present. Classes could interact with namespaces by importing their functions as methods. Dyalog's Windows GUI framework, already based on .NET classes, was integrated with the new Dyalog classes.


New [[Quad name]]s were added to support object-oriented programming: the [[system function]]s <source lang=apl inline>⎕NEW</source>, <source lang=apl inline>⎕CLASS</source>, <source lang=apl inline>⎕INSTANCES</source>, and <source lang=apl inline>⎕DF</source>, and [[system variable]]s <source lang=apl inline>⎕BASE</source> and <source lang=apl inline>⎕THIS</source>. Additionally, system functions <source lang=apl inline>⎕FIX</source> and <source lang=apl inline>⎕SRC</source> were added to support namespace scripts.
New [[Quad name]]s were added to support object-oriented programming: the [[system function]]s <syntaxhighlight lang=apl inline>⎕NEW</source>, <syntaxhighlight lang=apl inline>⎕CLASS</source>, <syntaxhighlight lang=apl inline>⎕INSTANCES</source>, and <syntaxhighlight lang=apl inline>⎕DF</source>, and [[system variable]]s <syntaxhighlight lang=apl inline>⎕BASE</source> and <syntaxhighlight lang=apl inline>⎕THIS</source>. Additionally, system functions <syntaxhighlight lang=apl inline>⎕FIX</source> and <syntaxhighlight lang=apl inline>⎕SRC</source> were added to support namespace scripts.


Dyalog 11.0 also included primitive extensions:
Dyalog 11.0 also included primitive extensions:
* [[Squad Indexing|Index]] (<source lang=apl inline>⌷</source>), possibly with [[Function axis|axis]], was added. A monadic case, called [[Materialise]], was also introduced in order to get a class's default property.
* [[Squad Indexing|Index]] (<syntaxhighlight lang=apl inline>⌷</source>), possibly with [[Function axis|axis]], was added. A monadic case, called [[Materialise]], was also introduced in order to get a class's default property.
* The [[Power (operator)|Power]] (<source lang=apl inline>⍣</source>) operator was added, with support for [[inverse]]s.
* The [[Power (operator)|Power]] (<syntaxhighlight lang=apl inline>⍣</source>) operator was added, with support for [[inverse]]s.
* [[And]] (<source lang=apl inline>∧</source>) and [[Or]] (<source lang=apl inline>∨</source>) were extended to non-[[Boolean]]s as the [[LCM]] and [[GCD]] functions, respectively.
* [[And]] (<syntaxhighlight lang=apl inline>∧</source>) and [[Or]] (<syntaxhighlight lang=apl inline>∨</source>) were extended to non-[[Boolean]]s as the [[LCM]] and [[GCD]] functions, respectively.


== 12.0 ==
== 12.0 ==
Line 36: Line 36:
Version 12.0 was released in August 2008. It introduced full [[Unicode]] support to Dyalog APL, so that all [[character]] data in the new Unicode edition consisted of Unicode code points. However, a Classic edition without Unicode (retaining Dyalog's old APL character set) was also released. As of version 18.0, every later Dyalog release has included both Classic and Unicode interpreters. Unicode characters were supported by three new [[internal type]]s: 1-byte, 2-byte, or 4-byte code points could be used depending on the maximum code point in the string. In each case a single element is a single code point, so the 1-byte and 2-byte encodings are compressed versions of [[wikipedia:UTF-32|UTF-32]], and are unrelated to variable-width encodings like [[wikipedia:UTF-8|UTF-8]] and [[wikipedia:UTF-16|UTF-16]]. This change affected the way character data was sorted, because Dyalog's character set did not have the same ordering as Unicode. The change to Unicode allowed a more standard way of implementing keyboard input to be used.
Version 12.0 was released in August 2008. It introduced full [[Unicode]] support to Dyalog APL, so that all [[character]] data in the new Unicode edition consisted of Unicode code points. However, a Classic edition without Unicode (retaining Dyalog's old APL character set) was also released. As of version 18.0, every later Dyalog release has included both Classic and Unicode interpreters. Unicode characters were supported by three new [[internal type]]s: 1-byte, 2-byte, or 4-byte code points could be used depending on the maximum code point in the string. In each case a single element is a single code point, so the 1-byte and 2-byte encodings are compressed versions of [[wikipedia:UTF-32|UTF-32]], and are unrelated to variable-width encodings like [[wikipedia:UTF-8|UTF-8]] and [[wikipedia:UTF-16|UTF-16]]. This change affected the way character data was sorted, because Dyalog's character set did not have the same ordering as Unicode. The change to Unicode allowed a more standard way of implementing keyboard input to be used.


In support of Unicode, the new [[system function]]s <source lang=apl inline>⎕AVU</source> (a Unicode version of <source lang=apl inline>⎕AV</source>) and <source lang=apl inline>⎕UCS</source> ([[Unicode Convert]]) were added. Two other system functions <source lang=apl inline>⎕FCOPY</source> (Copy File) and <source lang=apl inline>⎕FPROPS</source> (File Properties) were also added.
In support of Unicode, the new [[system function]]s <syntaxhighlight lang=apl inline>⎕AVU</source> (a Unicode version of <syntaxhighlight lang=apl inline>⎕AV</source>) and <syntaxhighlight lang=apl inline>⎕UCS</source> ([[Unicode Convert]]) were added. Two other system functions <syntaxhighlight lang=apl inline>⎕FCOPY</source> (Copy File) and <syntaxhighlight lang=apl inline>⎕FPROPS</source> (File Properties) were also added.


The new version integrated Causeway tools including SharpPlot with the interpreter. Dyalog had purchased these tools in April 2007. It also marked the official adoption of SALT (Simple APL Library Toolkit) as a way to distribute code; SALT had been included in version 11.0 as an experimental feature. [[Component file]]s were enhanced both with Unicode support and file journalling to improve recovery.
The new version integrated Causeway tools including SharpPlot with the interpreter. Dyalog had purchased these tools in April 2007. It also marked the official adoption of SALT (Simple APL Library Toolkit) as a way to distribute code; SALT had been included in version 11.0 as an experimental feature. [[Component file]]s were enhanced both with Unicode support and file journalling to improve recovery.
Line 46: Line 46:
Version 12.1 was released in November 2009. Although it was a minor release, developed alongside the much more ambitious version 13.0, it still included new language features in addition to improvements to the language environment and [[.NET]] integration.
Version 12.1 was released in November 2009. Although it was a minor release, developed alongside the much more ambitious version 13.0, it still included new language features in addition to improvements to the language environment and [[.NET]] integration.


The primitive function [[Table]] (<source lang=apl inline>⍪</source>) from [[ISO/IEC 13751:2001]], was added, as well as the [[I-beam]] operator (<source lang=apl inline>⌶</source>). I-beams for syntax colouring, parallel execution control, memory manager statistics, and exporting the workspace to .NET were provided; many more have been added since. Additionally, the [[system function]]s <source lang=apl inline>⎕XML</source>, for converting data to and from [[wikipedia:XML|XML]], and <source lang=apl inline>⎕FCHK</source>, to check and repair [[component file]]s, were added. The way the [[Outer Product]] operator computes the [[prototype]] of an [[empty]] result was changed: rather than using the right argument's prototype, in 12.1 it calls the operand once on the argument prototypes to determine the result prototype.
The primitive function [[Table]] (<syntaxhighlight lang=apl inline>⍪</source>) from [[ISO/IEC 13751:2001]], was added, as well as the [[I-beam]] operator (<syntaxhighlight lang=apl inline>⌶</source>). I-beams for syntax colouring, parallel execution control, memory manager statistics, and exporting the workspace to .NET were provided; many more have been added since. Additionally, the [[system function]]s <syntaxhighlight lang=apl inline>⎕XML</source>, for converting data to and from [[wikipedia:XML|XML]], and <syntaxhighlight lang=apl inline>⎕FCHK</source>, to check and repair [[component file]]s, were added. The way the [[Outer Product]] operator computes the [[prototype]] of an [[empty]] result was changed: rather than using the right argument's prototype, in 12.1 it calls the operand once on the argument prototypes to determine the result prototype.


== 13.0 ==
== 13.0 ==
Line 54: Line 54:
Version 13.0 was released in April 2011. It featured extensive changes to the language including support for [[Complex number|complex]] and [[decimal float]] [[numeric type]]s, [[identity function]] primitives, support for [[regular expression]]s, extensions to existing primitives, and new [[Idiom recognition|idioms]].
Version 13.0 was released in April 2011. It featured extensive changes to the language including support for [[Complex number|complex]] and [[decimal float]] [[numeric type]]s, [[identity function]] primitives, support for [[regular expression]]s, extensions to existing primitives, and new [[Idiom recognition|idioms]].


Support for [[complex number]]s including [[numeric literal]] notation such as <source lang=apl inline>3J4</source>, arithmetic and [[Circle function|circle]] functions, and [[tolerant comparison]]s [[Equal]] and [[Not Equal]] (but not [[array ordering]]: [[total array ordering]] including ordering of complex numbers was added in [[#17.0|17.0]]). While almost all changes were [[Backwards compatibility|backwards compatible]], backwards compatibility in the [[Power]] function was broken: fractional powers of negative numbers, such as <source lang=apl inline>¯8 * ÷3</source>, could return different results.
Support for [[complex number]]s including [[numeric literal]] notation such as <syntaxhighlight lang=apl inline>3J4</source>, arithmetic and [[Circle function|circle]] functions, and [[tolerant comparison]]s [[Equal]] and [[Not Equal]] (but not [[array ordering]]: [[total array ordering]] including ordering of complex numbers was added in [[#17.0|17.0]]). While almost all changes were [[Backwards compatibility|backwards compatible]], backwards compatibility in the [[Power]] function was broken: fractional powers of negative numbers, such as <syntaxhighlight lang=apl inline>¯8 * ÷3</source>, could return different results.


Support was added for 128-bit [[decimal floating point]] numbers (from [[wikipedia:IEEE 754|IEEE 754]]-2008), using the [[wikipedia:densely packed decimal|densely packed decimal]] (DPD) format internally. The [[system variable]] <source lang=apl inline>⎕FR</source> (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 <source lang=apl inline>⎕DCT</source> was added to control [[comparison tolerance]] with decfs enabled, with the default value <source lang=apl inline>1E¯28</source>. When <source lang=apl inline>⎕FR</source> is 645, <source lang=apl inline>⎕CT</source> controls the comparison tolerance, but when it is 1287, <source lang=apl inline>⎕DCT</source> 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 [[Array model#Numeric type coercion|changes in precision]] when placing values together in an array.
Support was added for 128-bit [[decimal floating point]] numbers (from [[wikipedia:IEEE 754|IEEE 754]]-2008), using the [[wikipedia:densely packed decimal|densely packed decimal]] (DPD) format internally. The [[system variable]] <syntaxhighlight lang=apl inline>⎕FR</source> (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 <syntaxhighlight lang=apl inline>⎕DCT</source> was added to control [[comparison tolerance]] with decfs enabled, with the default value <syntaxhighlight lang=apl inline>1E¯28</source>. When <syntaxhighlight lang=apl inline>⎕FR</source> is 645, <syntaxhighlight lang=apl inline>⎕CT</source> controls the comparison tolerance, but when it is 1287, <syntaxhighlight lang=apl inline>⎕DCT</source> 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 [[Array model#Numeric type coercion|changes in precision]] when placing values together in an array.


Identity functions <source lang=apl inline>⊣</source> ([[Same]], [[Left]]) and <source lang=apl inline>⊢</source> ([[Same]], [[Right]]) were introduced. Monadic <source lang=apl inline>+</source>, formerly called [[Identity]], was changed to [[Conjugate]] (a change which did not break backwards compatibility, because prior to the introduction of [[complex number]]s the two functions were indistinguishable). Dyadic functions [[Take]] (<source lang=apl inline>↑</source>), [[Drop]] (<source lang=apl inline>↓</source>), and [[Squad Indexing|Index]] (<source lang=apl inline>⌷</source>) were extended to allow short left arguments, matching [[SHARP APL]]'s interpretation of the [[leading axis theory]].
Identity functions <syntaxhighlight lang=apl inline>⊣</source> ([[Same]], [[Left]]) and <syntaxhighlight lang=apl inline>⊢</source> ([[Same]], [[Right]]) were introduced. Monadic <syntaxhighlight lang=apl inline>+</source>, formerly called [[Identity]], was changed to [[Conjugate]] (a change which did not break backwards compatibility, because prior to the introduction of [[complex number]]s the two functions were indistinguishable). Dyadic functions [[Take]] (<syntaxhighlight lang=apl inline>↑</source>), [[Drop]] (<syntaxhighlight lang=apl inline>↓</source>), and [[Squad Indexing|Index]] (<syntaxhighlight lang=apl inline>⌷</source>) were extended to allow short left arguments, matching [[SHARP APL]]'s interpretation of the [[leading axis theory]].


A [[primitive operator]] (<source lang=apl inline>⍠</source>) was introduced as an alternative spelling of the existing [[system operator]] [[Variant]] (<source lang=apl inline>⎕OPT</source>), with a functionality similar to one sketched by [[Ken Iverson]] (<source lang=apl inline>:</source>)<ref>[[Ken Iverson|Kenneth E. Iverson]], [https://www.jsoftware.com/papers/APLDictionary.htm A Dictionary of APL], VI. Conjunctions, [https://www.jsoftware.com/papers/APLDictionary1.htm#colon Custom]. APL Quote Quad, Volume 18, Number 1, 1987-09.</ref> and implemented in [[J]] (<source lang=j inline>!.</source>).
A [[primitive operator]] (<syntaxhighlight lang=apl inline>⍠</source>) was introduced as an alternative spelling of the existing [[system operator]] [[Variant]] (<syntaxhighlight lang=apl inline>⎕OPT</source>), with a functionality similar to one sketched by [[Ken Iverson]] (<syntaxhighlight lang=apl inline>:</source>)<ref>[[Ken Iverson|Kenneth E. Iverson]], [https://www.jsoftware.com/papers/APLDictionary.htm A Dictionary of APL], VI. Conjunctions, [https://www.jsoftware.com/papers/APLDictionary1.htm#colon Custom]. APL Quote Quad, Volume 18, Number 1, 1987-09.</ref> and implemented in [[J]] (<syntaxhighlight lang=j inline>!.</source>).


The [[Index Generator]] function was changed so that <source lang=apl inline>⍳⍬</source> would return <source lang=apl inline>⊂⍬</source> rather than <source lang=apl inline>⎕IO</source>. The former behaviour was considered a bug because <source lang=apl inline>⎕IO</source> is not a valid [[index]] into an array with [[empty]] [[shape]] (that is, a [[scalar]]).
The [[Index Generator]] function was changed so that <syntaxhighlight lang=apl inline>⍳⍬</source> would return <syntaxhighlight lang=apl inline>⊂⍬</source> rather than <syntaxhighlight lang=apl inline>⎕IO</source>. The former behaviour was considered a bug because <syntaxhighlight lang=apl inline>⎕IO</source> is not a valid [[index]] into an array with [[empty]] [[shape]] (that is, a [[scalar]]).


[[System operator]]s <source lang=apl inline>⎕S</source> and <source lang=apl inline>⎕R</source> were added to perform [[regex]] search and replace, respectively. The [[system function]] <source lang=apl inline>⎕RSI</source> (Reference Space Indicator) was implemented to return references to the namespaces from which functions were called: <source lang=apl inline>⎕RSI</source> is identical to <source lang=apl inline>⎕NSI</source> but returns [[namespace reference]]s instead of [[string]] names. System function <source lang=apl inline>⎕PROFILE</source> was added for line-level profiling of APL applications.
[[System operator]]s <syntaxhighlight lang=apl inline>⎕S</source> and <syntaxhighlight lang=apl inline>⎕R</source> were added to perform [[regex]] search and replace, respectively. The [[system function]] <syntaxhighlight lang=apl inline>⎕RSI</source> (Reference Space Indicator) was implemented to return references to the namespaces from which functions were called: <syntaxhighlight lang=apl inline>⎕RSI</source> is identical to <syntaxhighlight lang=apl inline>⎕NSI</source> but returns [[namespace reference]]s instead of [[string]] names. System function <syntaxhighlight lang=apl inline>⎕PROFILE</source> was added for line-level profiling of APL applications.


Dyalog's Input Method Editor (IME), used to control keyboard layouts, was redesigned.
Dyalog's Input Method Editor (IME), used to control keyboard layouts, was redesigned.


[[Idiom recognition]] was improved: the append idiom <source lang=apl inline>,←</source> was extended and a new append idiom <source lang=apl inline>⍪←</source> was added, as well as a new join idiom <source lang=apl inline>⍪/</source>. Tack-[[reduce]] idioms <source lang=apl inline>⊣⌿</source>, <source lang=apl inline>⊣/</source>, <source lang=apl inline>⊢⌿</source>, and <source lang=apl inline>⊢/</source> 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 <source lang=apl inline>*○</source>, producing a unit complex number, was also added.
[[Idiom recognition]] was improved: the append idiom <syntaxhighlight lang=apl inline>,←</source> was extended and a new append idiom <syntaxhighlight lang=apl inline>⍪←</source> was added, as well as a new join idiom <syntaxhighlight lang=apl inline>⍪/</source>. Tack-[[reduce]] idioms <syntaxhighlight lang=apl inline>⊣⌿</source>, <syntaxhighlight lang=apl inline>⊣/</source>, <syntaxhighlight lang=apl inline>⊢⌿</source>, and <syntaxhighlight lang=apl inline>⊢/</source> 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 <syntaxhighlight lang=apl inline>*○</source>, producing a unit complex number, was also added.


[[Dyadic Grade]] with a [[Bind|bound]] left argument was improved by allowing a [[retained hash]] of that left argument, in order to avoid reprocessing it during every invocation of Grade.
[[Dyadic Grade]] with a [[Bind|bound]] left argument was improved by allowing a [[retained hash]] of that left argument, in order to avoid reprocessing it during every invocation of Grade.
Line 80: Line 80:
Version 13.1 was released in April 2012.
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]] <source lang=apl inline>⎕DMX</source> (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]] <source lang=apl inline>⎕FHIST</source>, to access information about a file's history (such as time of creation), was also added.
Error messages were extended with the potential for additional information beyond the type of error. The [[system variable]] <syntaxhighlight lang=apl inline>⎕DMX</source> (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]] <syntaxhighlight lang=apl inline>⎕FHIST</source>, to access information about a file's history (such as time of creation), was also added.


New random number generators were added: the [[wikipedia:Mersenne twister|Mersenne twister]] algorithm, and querying the operating system. The algorithm could be selected with [[I-beam]] <source lang=apl inline>16807⌶</source>. Support was added for [[Enlist]] in [[selective assignment]].
New random number generators were added: the [[wikipedia:Mersenne twister|Mersenne twister]] algorithm, and querying the operating system. The algorithm could be selected with [[I-beam]] <syntaxhighlight lang=apl inline>16807⌶</source>. Support was added for [[Enlist]] in [[selective assignment]].


New [[Idiom recognition|idioms]] <source lang=apl inline>0=⊃⍴</source> and <source lang=apl inline>0≠⊃⍴</source> (valid for <source lang=apl inline>⎕ML<2</source>) were added. Idiom support was backported to [[#13.0|13.0]] as well.
New [[Idiom recognition|idioms]] <syntaxhighlight lang=apl inline>0=⊃⍴</source> and <syntaxhighlight lang=apl inline>0≠⊃⍴</source> (valid for <syntaxhighlight lang=apl inline>⎕ML<2</source>) were added. Idiom support was backported to [[#13.0|13.0]] as well.


[[Replicate]] was extended to allow extension of any right argument with length 1 along the replication axis, and not just a [[singleton]] right argument, matching [[APL2]]'s [[conformability]] rules for Replicate.
[[Replicate]] was extended to allow extension of any right argument with length 1 along the replication axis, and not just a [[singleton]] right argument, matching [[APL2]]'s [[conformability]] rules for Replicate.
Line 96: Line 96:
[[Selective assignment]] was was extended to allow [[bracket indexing]] and the [[Each]] operator, in order to match [[APL2]] behaviour.
[[Selective assignment]] was was extended to allow [[bracket indexing]] and the [[Each]] operator, in order to match [[APL2]] behaviour.


Performance of [[reduction]]s, [[scan]]s, and [[stranding]] was improved. In particular, stranding and the scans <source lang=apl inline>≤\</source>, <source lang=apl inline>>\</source>, <source lang=apl inline>≥\</source>, <source lang=apl inline>⍱\</source>, and <source lang=apl inline>⍲\</source> were all improved asymptotically, from <math>O(n^2)</math> to <math>O(n)</math> time in the length of the argument or number of stranded arrays.
Performance of [[reduction]]s, [[scan]]s, and [[stranding]] was improved. In particular, stranding and the scans <syntaxhighlight lang=apl inline>≤\</source>, <syntaxhighlight lang=apl inline>>\</source>, <syntaxhighlight lang=apl inline>≥\</source>, <syntaxhighlight lang=apl inline>⍱\</source>, and <syntaxhighlight lang=apl inline>⍲\</source> were all improved asymptotically, from <math>O(n^2)</math> to <math>O(n)</math> time in the length of the argument or number of stranded arrays.


== 14.0 ==
== 14.0 ==
Line 104: Line 104:
Version 14.0 was released in June 2014. It featured extensive changes to the Dyalog APL language as well as its implementation.
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]] (<source lang=apl inline>≢</source>), [[Key]] (<source lang=apl inline>⌸</source>), and the [[Rank operator]] (<source lang=apl inline>⍤</source>). [[Function train]]s, 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 [[frame]]s 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.
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]] (<syntaxhighlight lang=apl inline>≢</source>), [[Key]] (<syntaxhighlight lang=apl inline>⌸</source>), and the [[Rank operator]] (<syntaxhighlight lang=apl inline>⍤</source>). [[Function train]]s, 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 [[frame]]s 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 operator|Rank]] and [[leading axis theory]]. [[Index Of]] was [[High-rank set functions|extended]] (as in [[J]]) to allow a left argument of [[rank]] greater than 1, searching [[major cell]]s 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 [[Function axis|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 [[#18.0|version 18.0]].
Further changes were made in conjunction with the introduction of [[Rank operator|Rank]] and [[leading axis theory]]. [[Index Of]] was [[High-rank set functions|extended]] (as in [[J]]) to allow a left argument of [[rank]] greater than 1, searching [[major cell]]s 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 [[Function axis|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 [[#18.0|version 18.0]].
Line 110: Line 110:
This version allowed [[monadic operator]]s to be manipulated more easily: beginning in 14.0, they can be [[Assignment|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.
This version allowed [[monadic operator]]s to be manipulated more easily: beginning in 14.0, they can be [[Assignment|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 [[scan]]s. A new [[I-beam]], <source lang=apl inline>8⌶</source>, was introduced to allow fast lookups on [[inverted table]]s, paralleling the extension to [[Index Of]] to allow lookups on non-inverted tables.
Performance improvements to existing features were focused on [[Boolean]] arrays but also included work on [[indexing]] and [[scan]]s. A new [[I-beam]], <syntaxhighlight lang=apl inline>8⌶</source>, was introduced to allow fast lookups on [[inverted table]]s, 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 <source lang=apl inline>∊</source> indicates [[Enlist]] rather than [[Type]] by default. The default [[random link]] was changed to use the [[wikipedia:Mersenne Twister|Mersenne Twister]] algorithm rather than a [[wikipedia:linear congruential generator|linear congruential generator]]. Additionally, the assignment <source lang=apl inline>⎕RL←0</source> was introduced to initialize random number generation with a seed taken from the operating system (which therefore differs between different APL instances).
The default [[migration level]] was changed from 0 to 1, with the effect that monadic <syntaxhighlight lang=apl inline>∊</source> indicates [[Enlist]] rather than [[Type]] by default. The default [[random link]] was changed to use the [[wikipedia:Mersenne Twister|Mersenne Twister]] algorithm rather than a [[wikipedia:linear congruential generator|linear congruential generator]]. Additionally, the assignment <syntaxhighlight lang=apl inline>⎕RL←0</source> was introduced to initialize random number generation with a seed taken from the operating system (which therefore differs between different APL instances).


[[Component file]]s were enhanced with usability improvements in the component file [[system function]]s and the ability to create zipped (compressed) component files.
[[Component file]]s were enhanced with usability improvements in the component file [[system function]]s and the ability to create zipped (compressed) component files.
Line 122: Line 122:
Version 14.1 was released in June 2015. It added support for Apple Mac OS (now [[wikipedia:macOS|macOS]]) using the new [[RIDE]] [[session]] environment, which was also released for Windows and Linux.
Version 14.1 was released in June 2015. It added support for Apple Mac OS (now [[wikipedia:macOS|macOS]]) using the new [[RIDE]] [[session]] environment, which was also released for Windows and Linux.


Work continued on interfacing with [[.NET]], in particular databinding and a <source lang=apl inline>:Disposable</source> [[keyword]] to help manage object garbage collection.
Work continued on interfacing with [[.NET]], in particular databinding and a <syntaxhighlight lang=apl inline>:Disposable</source> [[keyword]] to help manage object garbage collection.


14.1 added support for [[control structure]]s and global variables to the bytecode compiler, and other performance improvements including improved evaluation of [[Idiom recognition|idioms]] and other special combinations.
14.1 added support for [[control structure]]s and global variables to the bytecode compiler, and other performance improvements including improved evaluation of [[Idiom recognition|idioms]] and other special combinations.


Support for parsing [[wikipedia:JSON|JSON]] files was added; it would later be turned into the [[system function]] <source lang=apl inline>⎕JSON</source> in [[#16.0|version 16.0]].
Support for parsing [[wikipedia:JSON|JSON]] files was added; it would later be turned into the [[system function]] <syntaxhighlight lang=apl inline>⎕JSON</source> in [[#16.0|version 16.0]].


== 15.0 ==
== 15.0 ==
Line 132: Line 132:
Release [https://www.dyalog.com/dyalog/dyalog-versions/150.htm announcement], [https://help.dyalog.com/15.0/index_CSH.htm#RelNotes15.0/Key%20Features.htm notes] ([https://docs.dyalog.com/15.0/Dyalog%20Version%2015.0%20Release%20Notes.pdf pdf])
Release [https://www.dyalog.com/dyalog/dyalog-versions/150.htm announcement], [https://help.dyalog.com/15.0/index_CSH.htm#RelNotes15.0/Key%20Features.htm notes] ([https://docs.dyalog.com/15.0/Dyalog%20Version%2015.0%20Release%20Notes.pdf pdf])


Version 15.0 was released in June 2016. It added platform-independent [[portable file functions]] (<source lang=apl inline>⎕NEXISTS</source>, <source lang=apl inline>⎕NINFO</source>, <source lang=apl inline>⎕NGET</source>, <source lang=apl inline>⎕NPUT</source>, <source lang=apl inline>⎕NDELETE</source>, <source lang=apl inline>⎕MKDIR</source>, and <source lang=apl inline>⎕NPARTS</source>) and improved support for using APL source code from text files. It also added [[I-beam]]s for [[case conversion]] and creating [[hashed array]]s which behave identically to normal arrays but have faster performance when searched with [[set function]]s including [[Index-Of]] (<source lang=apl inline>⍳</source>) and [[Membership]] (<source lang=apl inline>∊</source>).
Version 15.0 was released in June 2016. It added platform-independent [[portable file functions]] (<syntaxhighlight lang=apl inline>⎕NEXISTS</source>, <syntaxhighlight lang=apl inline>⎕NINFO</source>, <syntaxhighlight lang=apl inline>⎕NGET</source>, <syntaxhighlight lang=apl inline>⎕NPUT</source>, <syntaxhighlight lang=apl inline>⎕NDELETE</source>, <syntaxhighlight lang=apl inline>⎕MKDIR</source>, and <syntaxhighlight lang=apl inline>⎕NPARTS</source>) and improved support for using APL source code from text files. It also added [[I-beam]]s for [[case conversion]] and creating [[hashed array]]s which behave identically to normal arrays but have faster performance when searched with [[set function]]s including [[Index-Of]] (<syntaxhighlight lang=apl inline>⍳</source>) and [[Membership]] (<syntaxhighlight lang=apl inline>∊</source>).


Dyalog was made free for personal and non-commercial use starting in version 15.0.
Dyalog was made free for personal and non-commercial use starting in version 15.0.
Line 145: Line 145:


The following new primitive functions and operators were added:
The following new primitive functions and operators were added:
* [[Where]] (<source lang=apl inline>⍸</source>)
* [[Where]] (<syntaxhighlight lang=apl inline>⍸</source>)
* [[Interval Index]] (<source lang=apl inline>⍸</source>)
* [[Interval Index]] (<syntaxhighlight lang=apl inline>⍸</source>)
* [[Nest]] (<source lang=apl inline>⊆</source>)
* [[Nest]] (<syntaxhighlight lang=apl inline>⊆</source>)
* [[Partition]] (<source lang=apl inline>⊆</source>), another way to write a function which was previously only accessible with [[migration level]] 3
* [[Partition]] (<syntaxhighlight lang=apl inline>⊆</source>), another way to write a function which was previously only accessible with [[migration level]] 3
* [[At operator]] (<source lang=apl inline>@</source>)
* [[At operator]] (<syntaxhighlight lang=apl inline>@</source>)
* [[Stencil]] (<source lang=apl inline>⌺</source>)
* [[Stencil]] (<syntaxhighlight lang=apl inline>⌺</source>)


Additionally, [[system function]]s <source lang=apl inline>⎕JSON</source> and <source lang=apl inline>⎕CSV</source> were added to import and export data in common formats. Some JSON support was already present; 16.0 promoted it to a system function.
Additionally, [[system function]]s <syntaxhighlight lang=apl inline>⎕JSON</source> and <syntaxhighlight lang=apl inline>⎕CSV</source> were added to import and export data in common formats. Some JSON support was already present; 16.0 promoted it to a system function.


Work was continued on the [[RIDE]] [[session]] environment, which was made the default IDE on Linux in addition to macOS. Additionally, the [[HTMLRenderer]] and [[MiServer]] user interface tools were introduced.
Work was continued on the [[RIDE]] [[session]] environment, which was made the default IDE on Linux in addition to macOS. Additionally, the [[HTMLRenderer]] and [[MiServer]] user interface tools were introduced.
Line 164: Line 164:
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.
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]] (<source lang=apl inline>⍋</source>), [[Grade down]] (<source lang=apl inline>⍒</source>), and [[Interval Index]] (<source lang=apl inline>⍸</source>) to work on [[nested array]]s. Additionally, [[Unique]] (<source lang=apl inline>∪</source>) was extended to allow an argument of any rank by removing duplicate [[major cell]]s.
[[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]] (<syntaxhighlight lang=apl inline>⍋</source>), [[Grade down]] (<syntaxhighlight lang=apl inline>⍒</source>), and [[Interval Index]] (<syntaxhighlight lang=apl inline>⍸</source>) to work on [[nested array]]s. Additionally, [[Unique]] (<syntaxhighlight lang=apl inline>∪</source>) was extended to allow an argument of any rank by removing duplicate [[major cell]]s.


17.0 featured improvements to the HTML-based [[session]] environment [[RIDE]], and a preliminary version of [[Dyalog APL Link|Link]], which was fully released in [[#17.1|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.
17.0 featured improvements to the HTML-based [[session]] environment [[RIDE]], and a preliminary version of [[Dyalog APL Link|Link]], which was fully released in [[#17.1|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.
Line 170: Line 170:
Support for packaging APL code as a [[wikipedia:Shared library|shared library]] (for instance a .so or .dll file) for use by other languages was added.
Support for packaging APL code as a [[wikipedia:Shared library|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 <source lang=apl inline>⎕NCOPY</source> and <source lang=apl inline>⎕NMOVE</source> to copy and move files.
[[Portable file function]] support was improved, with changes including new functions <syntaxhighlight lang=apl inline>⎕NCOPY</source> and <syntaxhighlight lang=apl inline>⎕NMOVE</source> to copy and move files.


Version 17.0 implemented substantial [https://www.dyalog.com/dyalog/dyalog-versions/170/performance.htm performance improvements] in many areas. The most important improvements were better use of vector instructions including support for [[wikipedia:NEON (instruction set)|ARM NEON]] and [[wikipedia:AVX2|AVX2]] and vectorised [[comparison function]]s, simplification of trivial cases for functions, improved [[Boolean]] algorithms, and improvements to [[Replicate]], [[Expand]], and [[Where]].
Version 17.0 implemented substantial [https://www.dyalog.com/dyalog/dyalog-versions/170/performance.htm performance improvements] in many areas. The most important improvements were better use of vector instructions including support for [[wikipedia:NEON (instruction set)|ARM NEON]] and [[wikipedia:AVX2|AVX2]] and vectorised [[comparison function]]s, simplification of trivial cases for functions, improved [[Boolean]] algorithms, and improvements to [[Replicate]], [[Expand]], and [[Where]].
Line 178: Line 178:
Release [https://www.dyalog.com/dyalog/dyalog-versions/171.htm announcement], [https://help.dyalog.com/17.1/index.htm#RelNotes17.1/Highlights.htm notes]
Release [https://www.dyalog.com/dyalog/dyalog-versions/171.htm announcement], [https://help.dyalog.com/17.1/index.htm#RelNotes17.1/Highlights.htm notes]


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 [[Dyalog APL Link|Link]] system using <source lang=apl inline>]LINK</source>, allow running Dyalog through [[wikipedia:Docker (software)|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 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 [[Dyalog APL Link|Link]] system using <syntaxhighlight lang=apl inline>]LINK</source>, allow running Dyalog through [[wikipedia:Docker (software)|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.


The [[Interval Index]] (<source lang=apl inline>⍸</source>) primitive was extended to allow duplicate values in the left argument (a feature already present in [[J]], which does not verify that the left argument is sorted).
The [[Interval Index]] (<syntaxhighlight lang=apl inline>⍸</source>) primitive was extended to allow duplicate values in the left argument (a feature already present in [[J]], which does not verify that the left argument is sorted).


== 18.0 ==
== 18.0 ==
Line 188: Line 188:


The following new primitive functions and operators are added:
The following new primitive functions and operators are added:
* [[Unique Mask]] (<source lang=apl inline>≠</source>)
* [[Unique Mask]] (<syntaxhighlight lang=apl inline>≠</source>)
* [[Atop]] operator (<source lang=apl inline>⍤</source>), sharing a symbol with [[Rank operator|Rank]]
* [[Atop]] operator (<syntaxhighlight lang=apl inline>⍤</source>), sharing a symbol with [[Rank operator|Rank]]
* [[Over]] operator (<source lang=apl inline>⍥</source>)
* [[Over]] operator (<syntaxhighlight lang=apl inline>⍥</source>)
* [[Constant]] operator (<source lang=apl inline>⍨</source>), sharing a symbol with [[Commute]]
* [[Constant]] operator (<syntaxhighlight lang=apl inline>⍨</source>), sharing a symbol with [[Commute]]


Integers greater than 1 are now allowed in the right argument of [[Where]] (<source lang=apl inline>⍸</source>), 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]] (<source lang=apl inline>⊂</source>), which produce empty partitions in the output. The extension to Partitioned Enclose makes it the first APL partitioning function which can produce empty partitions.
Integers greater than 1 are now allowed in the right argument of [[Where]] (<syntaxhighlight lang=apl inline>⍸</source>), 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]] (<syntaxhighlight lang=apl inline>⊂</source>), 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 enabling multi-line input in the [[session]] using the [[line editor]], and allows [[control structure]]s 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.
Version 18.0 allows enabling multi-line input in the [[session]] using the [[line editor]], and allows [[control structure]]s 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 and extended [[system function]]s for case folding and mapping (<source lang=apl inline>⎕C</source>) and date-time conversion are added.
New and extended [[system function]]s for case folding and mapping (<syntaxhighlight lang=apl inline>⎕C</source>) and date-time conversion are added.


Initial support for [[wikipedia:.NET Core|.NET Core]], Microsoft's cross-platform successor to the original [[.NET]] framework, has been added.
Initial support for [[wikipedia:.NET Core|.NET Core]], Microsoft's cross-platform successor to the original [[.NET]] framework, has been added.
Line 207: Line 207:
[https://www.dyalog.com/dyalog/dyalog-versions/182.htm Release announcement], [http://docs.dyalog.com/18.2/Dyalog%20Version%2018.2%20Release%20Notes.pdf notes (pdf)]
[https://www.dyalog.com/dyalog/dyalog-versions/182.htm Release announcement], [http://docs.dyalog.com/18.2/Dyalog%20Version%2018.2%20Release%20Notes.pdf notes (pdf)]


Version 18.2 was released in March 2022. It's based on version 17.1, merged with selected changes from 18.1.<ref name="v18.2"/> New features include the ability to run as a shell script, system function <source lang=apl inline>⎕ATX</source> to get workspace metadata, and improvements to Windows Explorer integration, Docker support, and RIDE.
Version 18.2 was released in March 2022. It's based on version 17.1, merged with selected changes from 18.1.<ref name="v18.2"/> New features include the ability to run as a shell script, system function <syntaxhighlight lang=apl inline>⎕ATX</source> to get workspace metadata, and improvements to Windows Explorer integration, Docker support, and RIDE.


== References ==
== References ==
<references/>
<references/>
{{APL dialects}}[[Category:Dyalog APL]][[Category:Lists]]
{{APL dialects}}[[Category:Dyalog APL]][[Category:Lists]]

Revision as of 21:11, 10 September 2022

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.

10.0

Version 10.0 was released March 2003. It incorporated aspects of .NET support that had been part of Dyalog.NET, as well as other miscellaneous improvements to the language, interface, and performance.

The new constant value <syntaxhighlight lang=apl inline>⎕NULL</source> was added for better integration with .NET. Another new system function, <syntaxhighlight lang=apl inline>⎕NLOCK</source>, was added for file locking support. Two features were added to <syntaxhighlight lang=apl inline>:For</source> loops: the <syntaxhighlight lang=apl inline>:InEach</source> keyword for iterating simultaneously along several arrays, and automatic handling of .NET COM collections.

This release added keyword completion (AutoCompletion) and syntax colouring in the session. New performance features were added: recognised idioms were combinations of tokens supported by special code, and binding a search function (Index of or Membership) to its principal argument invoked the new retained hash table mechanism, saving the work of creating a hash table for that argument every time the search function was called after the first. The APLScript mechanism, allowing source files to be converted to workspaces for distribution, was also added. The resulting executables could be distributed with a copy of Dyalog APL in library form.

10.1

Version 10.1 was released July 2004. It allowed tradfn arguments and results to be composed of multiple variables (much like stranding) and featured improved thread handling, including a token pool mechanism for synchronisation. In preparation for the upcoming 64-bit release in version 11.0, it added support for 64-bit component files, which increased the 4GB limit on component file sizes imposed by 32-bit files.

System functions <syntaxhighlight lang=apl inline>⎕TPUT</source> and <syntaxhighlight lang=apl inline>⎕TGET</source> were added to manage threads, along with the system variable <syntaxhighlight lang=apl inline>⎕TPOOL</source> and function <syntaxhighlight lang=apl inline>⎕TREQ</source> to report on existing threads and requests. The current thread name can be found with the new system function <syntaxhighlight lang=apl inline>⎕TNAME</source>.

File handling system functions such as <syntaxhighlight lang=apl inline>⎕FCREATE</source> were extended to allow 0 as an input tie number, to indicate that the smallest available tie number should be used (0 is not a valid option). The release also featured further improvements to the session such as filename completion for workspace commands.

11.0

Release notes (pdf)

Version 11.0 was released October 2006, and was released for both 32- and 64-bit systems—Dyalog's first 64-bit release aside from a much earlier DEC Alpha release. It introduced object-oriented programming extensions designed to work like .NET and based technologically on the existing namespaces. The primary new features were classes, instances (objects), and interfaces, supporting inheritance, access control, and constructors and destructors. Instances could be placed in arrays, and empty arrays could store the class of an instance in the prototype. When instantiated (for instance by taking the First element of an empty array), a prototype object would be created using the class's niladic constructor, if present. Classes could interact with namespaces by importing their functions as methods. Dyalog's Windows GUI framework, already based on .NET classes, was integrated with the new Dyalog classes.

New Quad names were added to support object-oriented programming: the system functions <syntaxhighlight lang=apl inline>⎕NEW</source>, <syntaxhighlight lang=apl inline>⎕CLASS</source>, <syntaxhighlight lang=apl inline>⎕INSTANCES</source>, and <syntaxhighlight lang=apl inline>⎕DF</source>, and system variables <syntaxhighlight lang=apl inline>⎕BASE</source> and <syntaxhighlight lang=apl inline>⎕THIS</source>. Additionally, system functions <syntaxhighlight lang=apl inline>⎕FIX</source> and <syntaxhighlight lang=apl inline>⎕SRC</source> were added to support namespace scripts.

Dyalog 11.0 also included primitive extensions:

  • Index (<syntaxhighlight lang=apl inline>⌷</source>), possibly with axis, was added. A monadic case, called Materialise, was also introduced in order to get a class's default property.
  • The Power (<syntaxhighlight lang=apl inline>⍣</source>) operator was added, with support for inverses.
  • And (<syntaxhighlight lang=apl inline>∧</source>) and Or (<syntaxhighlight lang=apl inline>∨</source>) were extended to non-Booleans as the LCM and GCD functions, respectively.

12.0

Release notes, documentation centre

Version 12.0 was released in August 2008. It introduced full Unicode support to Dyalog APL, so that all character data in the new Unicode edition consisted of Unicode code points. However, a Classic edition without Unicode (retaining Dyalog's old APL character set) was also released. As of version 18.0, every later Dyalog release has included both Classic and Unicode interpreters. Unicode characters were supported by three new internal types: 1-byte, 2-byte, or 4-byte code points could be used depending on the maximum code point in the string. In each case a single element is a single code point, so the 1-byte and 2-byte encodings are compressed versions of UTF-32, and are unrelated to variable-width encodings like UTF-8 and UTF-16. This change affected the way character data was sorted, because Dyalog's character set did not have the same ordering as Unicode. The change to Unicode allowed a more standard way of implementing keyboard input to be used.

In support of Unicode, the new system functions <syntaxhighlight lang=apl inline>⎕AVU</source> (a Unicode version of <syntaxhighlight lang=apl inline>⎕AV</source>) and <syntaxhighlight lang=apl inline>⎕UCS</source> (Unicode Convert) were added. Two other system functions <syntaxhighlight lang=apl inline>⎕FCOPY</source> (Copy File) and <syntaxhighlight lang=apl inline>⎕FPROPS</source> (File Properties) were also added.

The new version integrated Causeway tools including SharpPlot with the interpreter. Dyalog had purchased these tools in April 2007. It also marked the official adoption of SALT (Simple APL Library Toolkit) as a way to distribute code; SALT had been included in version 11.0 as an experimental feature. Component files were enhanced both with Unicode support and file journalling to improve recovery.

12.1

Release notes, documentation centre

Version 12.1 was released in November 2009. Although it was a minor release, developed alongside the much more ambitious version 13.0, it still included new language features in addition to improvements to the language environment and .NET integration.

The primitive function Table (<syntaxhighlight lang=apl inline>⍪</source>) from ISO/IEC 13751:2001, was added, as well as the I-beam operator (<syntaxhighlight lang=apl inline>⌶</source>). I-beams for syntax colouring, parallel execution control, memory manager statistics, and exporting the workspace to .NET were provided; many more have been added since. Additionally, the system functions <syntaxhighlight lang=apl inline>⎕XML</source>, for converting data to and from XML, and <syntaxhighlight lang=apl inline>⎕FCHK</source>, to check and repair component files, were added. The way the Outer Product operator computes the prototype of an empty result was changed: rather than using the right argument's prototype, in 12.1 it calls the operand once on the argument prototypes to determine the result prototype.

13.0

Release notes, documentation centre

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 <syntaxhighlight lang=apl inline>3J4</source>, 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 <syntaxhighlight lang=apl inline>¯8 * ÷3</source>, 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 <syntaxhighlight lang=apl inline>⎕FR</source> (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 <syntaxhighlight lang=apl inline>⎕DCT</source> was added to control comparison tolerance with decfs enabled, with the default value <syntaxhighlight lang=apl inline>1E¯28</source>. When <syntaxhighlight lang=apl inline>⎕FR</source> is 645, <syntaxhighlight lang=apl inline>⎕CT</source> controls the comparison tolerance, but when it is 1287, <syntaxhighlight lang=apl inline>⎕DCT</source> 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.

Identity functions <syntaxhighlight lang=apl inline>⊣</source> (Same, Left) and <syntaxhighlight lang=apl inline>⊢</source> (Same, Right) were introduced. Monadic <syntaxhighlight lang=apl inline>+</source>, 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 (<syntaxhighlight lang=apl inline>↑</source>), Drop (<syntaxhighlight lang=apl inline>↓</source>), and Index (<syntaxhighlight lang=apl inline>⌷</source>) were extended to allow short left arguments, matching SHARP APL's interpretation of the leading axis theory.

A primitive operator (<syntaxhighlight lang=apl inline>⍠</source>) was introduced as an alternative spelling of the existing system operator Variant (<syntaxhighlight lang=apl inline>⎕OPT</source>), with a functionality similar to one sketched by Ken Iverson (<syntaxhighlight lang=apl inline>:</source>)[1] and implemented in J (<syntaxhighlight lang=j inline>!.</source>).

The Index Generator function was changed so that <syntaxhighlight lang=apl inline>⍳⍬</source> would return <syntaxhighlight lang=apl inline>⊂⍬</source> rather than <syntaxhighlight lang=apl inline>⎕IO</source>. The former behaviour was considered a bug because <syntaxhighlight lang=apl inline>⎕IO</source> is not a valid index into an array with empty shape (that is, a scalar).

System operators <syntaxhighlight lang=apl inline>⎕S</source> and <syntaxhighlight lang=apl inline>⎕R</source> were added to perform regex search and replace, respectively. The system function <syntaxhighlight lang=apl inline>⎕RSI</source> (Reference Space Indicator) was implemented to return references to the namespaces from which functions were called: <syntaxhighlight lang=apl inline>⎕RSI</source> is identical to <syntaxhighlight lang=apl inline>⎕NSI</source> but returns namespace references instead of string names. System function <syntaxhighlight lang=apl inline>⎕PROFILE</source> 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 <syntaxhighlight lang=apl inline>,←</source> was extended and a new append idiom <syntaxhighlight lang=apl inline>⍪←</source> was added, as well as a new join idiom <syntaxhighlight lang=apl inline>⍪/</source>. Tack-reduce idioms <syntaxhighlight lang=apl inline>⊣⌿</source>, <syntaxhighlight lang=apl inline>⊣/</source>, <syntaxhighlight lang=apl inline>⊢⌿</source>, and <syntaxhighlight lang=apl inline>⊢/</source> 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 <syntaxhighlight lang=apl inline>*○</source>, producing a unit complex number, was also added.

Dyadic Grade with a bound left argument was improved by allowing a retained hash of that left argument, in order to avoid reprocessing it during every invocation of Grade.

A new error message, INTERNAL ERROR (99) was added. Several I-beams related to Unix forks were added.

13.1

Release notes, documentation centre

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 <syntaxhighlight lang=apl inline>⎕DMX</source> (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 <syntaxhighlight lang=apl inline>⎕FHIST</source>, 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 <syntaxhighlight lang=apl inline>16807⌶</source>. Support was added for Enlist in selective assignment.

New idioms <syntaxhighlight lang=apl inline>0=⊃⍴</source> and <syntaxhighlight lang=apl inline>0≠⊃⍴</source> (valid for <syntaxhighlight lang=apl inline>⎕ML<2</source>) were added. Idiom support was backported to 13.0 as well.

Replicate was extended to allow extension of any right argument with length 1 along the replication axis, and not just a singleton right argument, matching APL2's conformability rules for Replicate.

13.2

Release notes, documentation centre

Version 13.2 was released in January 2013. It included GUI improvements, a new Array Editor, and minor improvements in the language and implementation.

Selective assignment was was extended to allow bracket indexing and the Each operator, in order to match APL2 behaviour.

Performance of reductions, scans, and stranding was improved. In particular, stranding and the scans <syntaxhighlight lang=apl inline>≤\</source>, <syntaxhighlight lang=apl inline>>\</source>, <syntaxhighlight lang=apl inline>≥\</source>, <syntaxhighlight lang=apl inline>⍱\</source>, and <syntaxhighlight lang=apl inline>⍲\</source> were all improved asymptotically, from to time in the length of the argument or number of stranded arrays.

14.0

Release announcement, notes (pdf)

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 (<syntaxhighlight lang=apl inline>≢</source>), Key (<syntaxhighlight lang=apl inline>⌸</source>), and the Rank operator (<syntaxhighlight lang=apl inline>⍤</source>). 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, <syntaxhighlight lang=apl inline>8⌶</source>, 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 <syntaxhighlight lang=apl inline>∊</source> 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 <syntaxhighlight lang=apl inline>⎕RL←0</source> was introduced to initialize random number generation with a seed taken from the operating system (which therefore differs between different APL instances).

Component files were enhanced with usability improvements in the component file system functions and the ability to create zipped (compressed) component files.

14.1

Release announcement, notes (pdf)

Version 14.1 was released in June 2015. It added support for Apple Mac OS (now macOS) using the new RIDE session environment, which was also released for Windows and Linux.

Work continued on interfacing with .NET, in particular databinding and a <syntaxhighlight lang=apl inline>:Disposable</source> keyword to help manage object garbage collection.

14.1 added support for control structures and global variables to the bytecode compiler, and other performance improvements including improved evaluation of idioms and other special combinations.

Support for parsing JSON files was added; it would later be turned into the system function <syntaxhighlight lang=apl inline>⎕JSON</source> in version 16.0.

15.0

Release announcement, notes (pdf)

Version 15.0 was released in June 2016. It added platform-independent portable file functions (<syntaxhighlight lang=apl inline>⎕NEXISTS</source>, <syntaxhighlight lang=apl inline>⎕NINFO</source>, <syntaxhighlight lang=apl inline>⎕NGET</source>, <syntaxhighlight lang=apl inline>⎕NPUT</source>, <syntaxhighlight lang=apl inline>⎕NDELETE</source>, <syntaxhighlight lang=apl inline>⎕MKDIR</source>, and <syntaxhighlight lang=apl inline>⎕NPARTS</source>) 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 (<syntaxhighlight lang=apl inline>⍳</source>) and Membership (<syntaxhighlight lang=apl inline>∊</source>).

Dyalog was made free for personal and non-commercial use starting in version 15.0.

Work on the cross-platform session environment RIDE continued, with version 3.0 released simultaneously with Dyalog 15.0.

16.0

Release announcement, notes (pdf)

Version 16.0 was released in June 2017. It added several new primitives as well as tools for working with JSON and CSV files.

The following new primitive functions and operators were added:

  • Where (<syntaxhighlight lang=apl inline>⍸</source>)
  • Interval Index (<syntaxhighlight lang=apl inline>⍸</source>)
  • Nest (<syntaxhighlight lang=apl inline>⊆</source>)
  • Partition (<syntaxhighlight lang=apl inline>⊆</source>), another way to write a function which was previously only accessible with migration level 3
  • At operator (<syntaxhighlight lang=apl inline>@</source>)
  • Stencil (<syntaxhighlight lang=apl inline>⌺</source>)

Additionally, system functions <syntaxhighlight lang=apl inline>⎕JSON</source> and <syntaxhighlight lang=apl inline>⎕CSV</source> were added to import and export data in common formats. Some JSON support was already present; 16.0 promoted it to a system function.

Work was continued on the RIDE session environment, which was made the default IDE on Linux in addition to macOS. Additionally, the HTMLRenderer and MiServer user interface tools were introduced.

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.

17.0

Release announcement, notes

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 (<syntaxhighlight lang=apl inline>⍋</source>), Grade down (<syntaxhighlight lang=apl inline>⍒</source>), and Interval Index (<syntaxhighlight lang=apl inline>⍸</source>) to work on nested arrays. Additionally, Unique (<syntaxhighlight lang=apl inline>∪</source>) 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 <syntaxhighlight lang=apl inline>⎕NCOPY</source> and <syntaxhighlight lang=apl inline>⎕NMOVE</source> 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.

17.1

Release announcement, notes

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 <syntaxhighlight lang=apl inline>]LINK</source>, 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.

The Interval Index (<syntaxhighlight lang=apl inline>⍸</source>) primitive was extended to allow duplicate values in the left argument (a feature already present in J, which does not verify that the left argument is sorted).

18.0

Release announcement, notes

Version 18.0 was released in June 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 (<syntaxhighlight lang=apl inline>≠</source>)
  • Atop operator (<syntaxhighlight lang=apl inline>⍤</source>), sharing a symbol with Rank
  • Over operator (<syntaxhighlight lang=apl inline>⍥</source>)
  • Constant operator (<syntaxhighlight lang=apl inline>⍨</source>), sharing a symbol with Commute

Integers greater than 1 are now allowed in the right argument of Where (<syntaxhighlight lang=apl inline>⍸</source>), 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 (<syntaxhighlight lang=apl inline>⊂</source>), 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 enabling 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 and extended system functions for case folding and mapping (<syntaxhighlight lang=apl inline>⎕C</source>) and date-time conversion are added.

Initial support for .NET Core, Microsoft's cross-platform successor to the original .NET framework, has been added.

18.1

Version 18.1 (briefly called 19.0) was initially delayed[2] and subsequently discarded[3] due to bugs found in the optimisations made in version 18.0. Its features were transferred to version 18.2.

18.2

Release announcement, notes (pdf)

Version 18.2 was released in March 2022. It's based on version 17.1, merged with selected changes from 18.1.[3] New features include the ability to run as a shell script, system function <syntaxhighlight lang=apl inline>⎕ATX</source> to get workspace metadata, and improvements to Windows Explorer integration, Docker support, and RIDE.

References

APL dialects [edit]
Maintained APL+WinAPL2APL64APL\ivApletteAprilCo-dfnsDyalog APLDyalog APL Visiondzaima/APLGNU APLKapNARS2000PometoTinyAPL
Historical A Programming LanguageA+ (A) ∙ APL#APL2CAPL\360APL/700APL\1130APL\3000APL.68000APL*PLUSAPL.jlAPL.SVAPLXExtended Dyalog APLIverson notationIVSYS/7090NARSngn/aplopenAPLOperators and FunctionsPATRowanSAXSHARP APLRationalized APLVisualAPL (APLNext) ∙ VS APLYork APL
Derivatives AHPLBQNCoSyELIGleeIIvyJJellyK (Goal, Klong, Q) ∙ KamilaLispLang5LilNialRADUiua
Overviews Comparison of APL dialectsTimeline of array languagesTimeline of influential array languagesFamily tree of array languages