Migration level: Difference between revisions

From APL Wiki
Jump to navigation Jump to search
m (Text replacement - "<source" to "<syntaxhighlight")
 
(4 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{Built-ins3|Migration level|⎕ML|⎕EL|⎕CS}}, '''Evolution level''', or '''Compatibility setting''' is a number that, in [[Dyalog APL]], [[APL+Win]], and [[APLX]] respectively, specifies exact behaviour relative to [[APL2]]. In Dyalog APL and APL+Win, a lower value represents a behaviour closer to the original [[NARS]] specification, while a higher the value represents a behaviour closer to APL2. In APLX, a lower value matches APL2 while a higher value indicates higher [[backwards compatibility]] with [[APL.68000]].
{{Built-ins3|Migration level|⎕ML|)EvLevel|⎕CS}}, '''Evolution level''', or '''Compatibility setting''' is a number that, in [[Dyalog APL]], [[APL+Win]], and [[APLX]] respectively, specifies exact behaviour relative to [[APL2]]. In Dyalog APL and APL+Win, a lower value represents a behaviour closer to the original [[NARS]] specification, while a higher the value represents a behaviour closer to APL2. In APLX, a lower value matches APL2 while a higher value indicates higher [[backwards compatibility]] with [[APL.68000]].


== APL+Win settings ==
== APL+Win settings ==


[TBD]
APL+Win's default is <syntaxhighlight lang=apl inline>)EvLevel 2</syntaxhighlight>.
 
{|class=wikitable
! Feature
! <syntaxhighlight lang=apl inline>)EvLevel 0</syntaxhighlight>
! <syntaxhighlight lang=apl inline>)EvLevel 1</syntaxhighlight>
! <syntaxhighlight lang=apl inline>)EvLevel 2</syntaxhighlight>
|-
| Dyadic <syntaxhighlight lang=apl inline>⊂</syntaxhighlight>
| [[EVOLUTION ERROR]]
| [[Partitioned Enclose]]
| [[Partition]]
|-
| Monadic <syntaxhighlight lang=apl inline>↓</syntaxhighlight>
| [[EVOLUTION ERROR]]
| [[Split]]
| [[SYNTAX ERROR]]
|-
| Monadic <syntaxhighlight lang=apl inline>∊</syntaxhighlight>
| [[EVOLUTION ERROR]]
| [[Type]]
| [[Enlist]]
|-
| Monadic <syntaxhighlight lang=apl inline>↑</syntaxhighlight>
| [[EVOLUTION ERROR]]
| [[Mix]]
| [[First]]
|-
| Monadic <syntaxhighlight lang=apl inline>⊃</syntaxhighlight>
| [[EVOLUTION ERROR]]
| [[First]]
| [[Mix]]
|-
| [[Bracket indexing]] of a [[strand]]
| [[EVOLUTION ERROR]]
| indexing applied to strand as a whole
| [[EVOLUTION ERROR]]
|-
| Unparenthesised [[strand]] [[assignment]]
| [[EVOLUTION ERROR]]
| assigned value distributed to names
| [[EVOLUTION ERROR]]
|-
| <syntaxhighlight lang=apl inline>(/)</syntaxhighlight>
| [[EVOLUTION ERROR]]
| [[Replicate]] [[function]]
| [[EVOLUTION ERROR]]
|-
| <syntaxhighlight lang=apl inline>(\)</syntaxhighlight>
| [[EVOLUTION ERROR]]
| [[Expand]] [[function]]
| [[EVOLUTION ERROR]]
|}
 
=== Work-arounds ===
 
APL+Win provides [[system function]] alternatives to the functions that are affected by moving to evolution level 2:
 
{|class=wikitable
| [[Partitioned Enclose]]
| <syntaxhighlight lang=apl inline>⎕PENCLOSE</syntaxhighlight>
|-
| [[Split]]
| <syntaxhighlight lang=apl inline>⎕SPLIT</syntaxhighlight>
|-
| [[Type]]
| <syntaxhighlight lang=apl inline>⎕TYPE</syntaxhighlight>
|-
| [[Mix]]
| <syntaxhighlight lang=apl inline>⎕MIX</syntaxhighlight>
|-
| [[First]]
| <syntaxhighlight lang=apl inline>⎕FIRST</syntaxhighlight>
|-
| [[Replicate]] [[function]]
| <syntaxhighlight lang=apl inline>⎕REPL</syntaxhighlight>
|-
| [[Expand]] [[function]]
| <syntaxhighlight lang=apl inline>⎕EXPAND</syntaxhighlight>
|}


== Dyalog settings ==
== Dyalog settings ==


Dyalog APL currently offers the following settings:
Dyalog's default setting is currently <syntaxhighlight lang=apl inline>⎕ML=1</syntaxhighlight>.


{| class=wikitable
{| class=wikitable
| <syntaxhighlight lang=apl inline>⎕ML=0</source>
! Feature !! <syntaxhighlight lang=apl inline>⎕ML←0</syntaxhighlight> !! <syntaxhighlight lang=apl inline>⎕ML←1</syntaxhighlight> !! <syntaxhighlight lang=apl inline>⎕ML←2</syntaxhighlight> !! <syntaxhighlight lang=apl inline>⎕ML←3</syntaxhighlight>
| <syntaxhighlight lang=apl inline>Z←∊R</source>
| Monadic <syntaxhighlight lang=apl inline></source> is interpreted as [[Type]] rather than [[Enlist]].
|-
|-
| <syntaxhighlight lang=apl inline>⎕ML=1</source>
| Monadic <syntaxhighlight lang=apl inline></syntaxhighlight>
|  
| [[Type]]
| Default behaviour
| [[Enlist]]
| [[Enlist]]
| [[Enlist]]
|-
|-
| rowspan=3 | <syntaxhighlight lang=apl inline>⎕ML≥2</source>
| Monadic <syntaxhighlight lang=apl inline></syntaxhighlight>
| <syntaxhighlight lang=apl inline>Z←↑R</source>
| [[Mix]]
| Monadic <syntaxhighlight lang=apl inline>↑</source> is interpreted as [[First]] rather than [[Mix]].
| [[Mix]]
| [[First]]
| [[First]]
|-
|-
| <syntaxhighlight lang=apl inline>Z←⊃R</source>
| Monadic <syntaxhighlight lang=apl inline></syntaxhighlight>
| Monadic <syntaxhighlight lang=apl inline></source> is interpreted as [[Mix]] rather than [[First]].
| [[First]]
| [[First]]
| [[Mix]]
| [[Mix]]
|-
| Monadic <syntaxhighlight lang=apl inline></syntaxhighlight> on array of uneven [[depth]]
| negative result
| negative result
| positive result
| positive result
|-  
|-  
| <syntaxhighlight lang=apl inline>Z←≡R</source>
| Dyadic <syntaxhighlight lang=apl inline></syntaxhighlight>
| Monadic <syntaxhighlight lang=apl inline>≡</source> returns a positive rather than a negative value, if its argument has non-uniform [[depth]].
| [[Partitioned enclose]]
| [[Partitioned enclose]]
| [[Partitioned enclose]]
| [[Partition]]
|-
|-
| rowspan=2| <syntaxhighlight lang=apl inline>⎕ML=3</source>
| <syntaxhighlight lang=apl inline>⎕TC</syntaxhighlight>
| <syntaxhighlight lang=apl inline>R←X⊂[K]Y</source>
| <syntaxhighlight lang=apl inline>⎕UCS 8 10 13</syntaxhighlight>
| Dyadic <syntaxhighlight lang=apl inline></source> is interpreted as [[Partition]] (<syntaxhighlight lang=apl inline>⊆</source>) rather than [[Partitioned Enclose]].
| <syntaxhighlight lang=apl inline>⎕UCS 8 10 13</syntaxhighlight>
|-
| <syntaxhighlight lang=apl inline>⎕UCS 8 10 13</syntaxhighlight>
| <syntaxhighlight lang=apl inline>⎕TC</source>
| <syntaxhighlight lang=apl inline>⎕UCS 8 13 10</syntaxhighlight>
| The order of the elements of <syntaxhighlight lang=apl inline>⎕TC</source> is the same as in APL2.
|}
|}


=== Work-arounds ===
=== Work-arounds ===
When migrating to Dyalog APL, the below drop-ins for the affected [[built-ins]] allow setting <syntaxhighlight lang=apl inline>⎕ML←1</source> while preserving code behaviour. It is then safe to programmatically (as shown in the rightmost column) change all occurrences of the affected built-ins with their respective covers.
When migrating to Dyalog APL, the below drop-ins for the affected [[built-ins]] allow setting <syntaxhighlight lang=apl inline>⎕ML←1</syntaxhighlight> while preserving code behaviour. It is then safe to programmatically (as shown in the rightmost column) change all occurrences of the affected built-ins with their respective covers.


{| class=wikitable
{| class=wikitable
! Migrating from !! Define !! Then run this on all code
! Migrating from !! Define !! Then run this on all code
|-
|-
| <syntaxhighlight lang=apl inline>⎕ML=0</source>
| <syntaxhighlight lang=apl inline>⎕ML=0</syntaxhighlight>
| <syntaxhighlight lang=apl>Epsilon←{×⎕NC'⍺':⍺∊⍵ ⋄ ⊃0⍴⊂⍵}</source>
| <syntaxhighlight lang=apl>Epsilon←{×⎕NC'⍺':⍺∊⍵ ⋄ ⊃0⍴⊂⍵}</syntaxhighlight>
| <syntaxhighlight lang=apl inline>'''[^'']+''' '∊'⎕R'&' 'Epsilon'</source>
| <syntaxhighlight lang=apl inline>'''[^'']+''' '∊'⎕R'&' ' Epsilon '</syntaxhighlight>
|-
|-
| <syntaxhighlight lang=apl inline>⎕ML=2</source>
| <syntaxhighlight lang=apl inline>⎕ML=2</syntaxhighlight>
| <syntaxhighlight lang=apl>
| <syntaxhighlight lang=apl>
UpArrow←{×⎕NC'⍺':⍺↑⍵ ⋄ ⊃⍵}
UpArrow←{×⎕NC'⍺':⍺↑⍵ ⋄ ⊃⍵}
RightShoe←{×⎕NC'⍺':⍺↑⍵ ⋄ ↑⍵}
RightShoe←{×⎕NC'⍺':⍺↑⍵ ⋄ ↑⍵}
EqualUnderbar←|≡
EqualUnderbar←|≡
</source>
</syntaxhighlight>
| <syntaxhighlight lang=apl inline>'''[^'']+''' '↑' '⊃' '≡'⎕R'&' 'UpArrow' 'RightShoe' 'EqualUnderbar'</source>
| <syntaxhighlight lang=apl inline>'''[^'']+''' '↑' '⊃' '≡'⎕R'&' ' UpArrow ' ' RightShoe ' ' EqualUnderbar '</syntaxhighlight>
|-
|-
| <syntaxhighlight lang=apl inline>⎕ML=3</source>
| <syntaxhighlight lang=apl inline>⎕ML=3</syntaxhighlight>
| <syntaxhighlight lang=apl>
| <syntaxhighlight lang=apl>
UpArrow←{×⎕NC'⍺':⍺↑⍵ ⋄ ⊃⍵}
UpArrow←{×⎕NC'⍺':⍺↑⍵ ⋄ ⊃⍵}
Line 61: Line 153:
LeftShoe←{×⎕NC'⍺':⍺⊆⍵ ⋄ ⊂⍵}
LeftShoe←{×⎕NC'⍺':⍺⊆⍵ ⋄ ⊂⍵}
quadTC←(⎕UCS 8 13 10)
quadTC←(⎕UCS 8 13 10)
</source>
</syntaxhighlight>
| <syntaxhighlight lang=apl inline>'''[^'']+''' '↑' '⊃' '≡' '⊂' '⎕TC'⎕R'&' 'UpArrow' 'RightShoe' 'EqualUnderbar' 'LeftShoe' ' quadTC'</source>
| <syntaxhighlight lang=apl inline>'''[^'']+''' '↑' '⊃' '≡' '⊂' '⎕TC'⎕R'&' ' UpArrow ' ' RightShoe ' ' EqualUnderbar ' ' LeftShoe ' ' quadTC '</syntaxhighlight>
|}
|}
Alternatively, the definitions can be used directly inside the text substitutions, whereby one avoids polluting existing code with these cover names.
Alternatively, the definitions can be used directly inside the text substitutions, whereby one avoids polluting existing code with these cover names.
Line 71: Line 163:


{|class=wikitable
{|class=wikitable
| <syntaxhighlight lang=apl inline>⎕CS←1</source> || [[Strand notation|Stranding]] is done before [[bracket indexing]]
| <syntaxhighlight lang=apl inline>⎕CS←1</syntaxhighlight> || [[Strand notation|Stranding]] is done before [[bracket indexing]]
|-
|-
| <syntaxhighlight lang=apl inline>⎕CS←2</source> || The [[name class]] of an invalid name is 4 rather than ¯1.
| <syntaxhighlight lang=apl inline>⎕CS←2</syntaxhighlight> || The [[name class]] of an invalid name is 4 rather than ¯1.
|-
|-
| <syntaxhighlight lang=apl inline>⎕CS←4</source> || Format (<syntaxhighlight lang=apl inline>⍕</source>) and default output uses the same width for all columns, rather than determining  the  width separately for  each column.
| <syntaxhighlight lang=apl inline>⎕CS←4</syntaxhighlight> || Format (<syntaxhighlight lang=apl inline>⍕</syntaxhighlight>) and default output uses the same width for all columns, rather than determining  the  width separately for  each column.
|}
|}



Latest revision as of 17:40, 20 February 2024

⎕ML )EvLevel ⎕CS

Migration level (⎕ML, )EvLevel, ⎕CS), Evolution level, or Compatibility setting is a number that, in Dyalog APL, APL+Win, and APLX respectively, specifies exact behaviour relative to APL2. In Dyalog APL and APL+Win, a lower value represents a behaviour closer to the original NARS specification, while a higher the value represents a behaviour closer to APL2. In APLX, a lower value matches APL2 while a higher value indicates higher backwards compatibility with APL.68000.

APL+Win settings

APL+Win's default is )EvLevel 2.

Feature )EvLevel 0 )EvLevel 1 )EvLevel 2
Dyadic EVOLUTION ERROR Partitioned Enclose Partition
Monadic EVOLUTION ERROR Split SYNTAX ERROR
Monadic EVOLUTION ERROR Type Enlist
Monadic EVOLUTION ERROR Mix First
Monadic EVOLUTION ERROR First Mix
Bracket indexing of a strand EVOLUTION ERROR indexing applied to strand as a whole EVOLUTION ERROR
Unparenthesised strand assignment EVOLUTION ERROR assigned value distributed to names EVOLUTION ERROR
(/) EVOLUTION ERROR Replicate function EVOLUTION ERROR
(\) EVOLUTION ERROR Expand function EVOLUTION ERROR

Work-arounds

APL+Win provides system function alternatives to the functions that are affected by moving to evolution level 2:

Partitioned Enclose ⎕PENCLOSE
Split ⎕SPLIT
Type ⎕TYPE
Mix ⎕MIX
First ⎕FIRST
Replicate function ⎕REPL
Expand function ⎕EXPAND

Dyalog settings

Dyalog's default setting is currently ⎕ML=1.

Feature ⎕ML←0 ⎕ML←1 ⎕ML←2 ⎕ML←3
Monadic Type Enlist Enlist Enlist
Monadic Mix Mix First First
Monadic First First Mix Mix
Monadic on array of uneven depth negative result negative result positive result positive result
Dyadic Partitioned enclose Partitioned enclose Partitioned enclose Partition
⎕TC ⎕UCS 8 10 13 ⎕UCS 8 10 13 ⎕UCS 8 10 13 ⎕UCS 8 13 10

Work-arounds

When migrating to Dyalog APL, the below drop-ins for the affected built-ins allow setting ⎕ML←1 while preserving code behaviour. It is then safe to programmatically (as shown in the rightmost column) change all occurrences of the affected built-ins with their respective covers.

Migrating from Define Then run this on all code
⎕ML=0
Epsilon←{×⎕NC'⍺':⍺∊⍵ ⋄ ⊃0⍴⊂⍵}
'''[^'']+''' '∊'⎕R'&' ' Epsilon '
⎕ML=2
UpArrow←{×⎕NC'⍺':⍺↑⍵ ⋄ ⊃⍵}
RightShoe←{×⎕NC'⍺':⍺↑⍵ ⋄ ↑⍵}
EqualUnderbar←|≡
'''[^'']+''' '↑' '⊃' '≡'⎕R'&' ' UpArrow ' ' RightShoe ' ' EqualUnderbar '
⎕ML=3
UpArrow←{×⎕NC'⍺':⍺↑⍵ ⋄ ⊃⍵}
RightShoe←{×⎕NC'⍺':⍺↑⍵ ⋄ ↑⍵}
EqualUnderbar←(|≡)
LeftShoe←{×⎕NC'⍺':⍺⊆⍵ ⋄ ⊂⍵}
quadTC←(⎕UCS 8 13 10)
'''[^'']+''' '↑' '⊃' '≡' '⊂' '⎕TC'⎕R'&' ' UpArrow ' ' RightShoe ' ' EqualUnderbar ' ' LeftShoe ' ' quadTC '

Alternatively, the definitions can be used directly inside the text substitutions, whereby one avoids polluting existing code with these cover names.

APLX settings

APLX treats the value as a collection of individual bits, thus allowing the combination of an exact set of behaviours:

⎕CS←1 Stranding is done before bracket indexing
⎕CS←2 The name class of an invalid name is 4 rather than ¯1.
⎕CS←4 Format () and default output uses the same width for all columns, rather than determining the width separately for each column.

External links

Documentation

APL built-ins [edit]
Primitives (Timeline) Functions
Scalar
Monadic ConjugateNegateSignumReciprocalMagnitudeExponentialNatural LogarithmFloorCeilingFactorialNotPi TimesRollTypeImaginarySquare Root
Dyadic AddSubtractTimesDivideResiduePowerLogarithmMinimumMaximumBinomialComparison functionsBoolean functions (And, Or, Nand, Nor) ∙ GCDLCMCircularComplexRoot
Non-Scalar
Structural ShapeReshapeTallyDepthRavelEnlistTableCatenateReverseRotateTransposeRazeMixSplitEncloseNestCut (K)PairLinkPartitioned EnclosePartition
Selection FirstPickTakeDropUniqueIdentityStopSelectReplicateExpandSet functions (IntersectionUnionWithout) ∙ Bracket indexingIndexCartesian ProductSort
Selector Index generatorGradeIndex OfInterval IndexIndicesDealPrefix and suffix vectors
Computational MatchNot MatchMembershipFindNub SieveEncodeDecodeMatrix InverseMatrix DivideFormatExecuteMaterialiseRange
Operators Monadic EachCommuteConstantReplicateExpandReduceWindowed ReduceScanOuter ProductKeyI-BeamSpawnFunction axis
Dyadic BindCompositions (Compose, Reverse Compose, Beside, Withe, Atop, Over) ∙ Inner ProductDeterminantPowerAtUnderRankDepthVariantStencilCutDirect definition (operator)
Quad names Index originComparison toleranceMigration levelAtomic vector
APL glyphs [edit]
Information GlyphTyping glyphs (on Linux) ∙ UnicodeFontsMnemonicsOverstrikesMigration level
Individual glyphs Jot () ∙ Right Shoe () ∙ Up Arrow () ∙ Zilde () ∙ High minus (¯) ∙ Dot (.) ∙ Del ()