New APL+Win Features

Do you know all APL+Win enhancements since APL+Win v10?
Are you using all the new features available in your APL+Win interpreter?
Check the APL+Win New Features database and become a better APL+Win Developer!

Category:
Search Text (case insensitive):

Description

The new EnableSSE2 INI file parameter is set to 0 by default, thus not enabling the SSE2 experimental speedups; you can set it to 1 to enable them.

Example

The EnableSSE2 parameter is in the [Experimental] section of the APLW.INI file:

[Experimental]
EnableSSE2=1
More details...

Description

SSE2 is a computer processor architecture and associated instruction set which provides for a single instruction to process multiple data items. Its application to APL+Win array operations has beneficial effects on performance.

When the EnableSSE2 .INI file parameter is set to 1, the SSE2 instruction set is used to optimize array-based arithmetic operations: + - × ÷. These array operations can run up to twice as fast as without SSE2 enabled depending on the size of the processed array. The DEMO_SSE2.W3 workspace is included in this release to test this enhancement.

The following benchmarks show improved performance gained by using SSE2:









Overall %Improved All Operations & All Array Sizes: 33.93%
Notes:
  • float, int indicate floating point array and integer array respectively
  • Array sizes were varied in the range [10, 100000]
  • fScal, iScal indicate floating point scalar and integer scalar respectively
  • Workstation: Win10 Pro, dual core 2.30Mhz
More details...

Description

The new DEMO_SSE2 workspace in the APL+Win v17.1 Examples folder contains functions to test the SSE2 speedup enhancements.
br/> Be sure to update the lx function if you did not install APL+Win v17.1 in C:\APLWIN17. More details...

Description

A new update to the LC.Charts application by Eric Lescasse that can display your APL data in a variety of charts. More details...

Description

Corrected placement of the Find and Replace dialogs when using multiple displays. This means the Find and Replace dialogs appears where they were last positioned instead of the primary display. More details...

Description

Added support for DPI-awareness in the session manager window and the ⎕WI objects (excluding any ActiveX controls and objects). More details...

Description

The scale property scalemode element 5 now returns virtual pixels instead of pixels More details...

Description

Added the read-only system object property dpi that specifies the DPI-Aware state of APL. The four-element nested vector has the following values:
  1. returns 1 if APL+Win is running in DPI aware mode; 0 if DPI un-aware mode.
  2. returns the system-wide DPI scaling percentage of the system (100 by default, 200 for 200% scaling, etc.).
  3. returns the dots per inch of the system-wide DPI scaling (96 at 100% scaling, 192 at 200% scaling, etc.).
  4. returns the pixel height of the default font.

Example

      '#'⎕wi'dpi'
1 200 192 25    
More details...

Description

The opaque property defines the behaviour of the opaque feature in some APLGUI controls. The opaque property can have a value of 0 or 1. The default value is 1. A value of 0 causes the background of the object to be transparent such that the parent window behind it is visible through the background area of the control. For example, a Check control that's a child of a Picture control will display the image assigned to the Picture control as the background of the Check control. More details...

Description

The new style property value 65536 has been added to the Button and UButton objects to allow their caption to wrap when the width of the caption is wider than the width of these objects.

Example

      ←'ff'⎕wi'Create' 'Form'('scale'5)('size'200 300)
      ←'ff'⎕wi'.bn.Create' 'Button'('style'65536)('where'10 10 40 100)
      ←'ff'⎕wi'.bn.caption' 'Print the Excel Document'
More details...

Description

This enhancement improves the default font selection process for ⎕wi objects when running in DPI aware mode. This dramatically improves the font size versus window layout behaviour when running at high DPI scaling levels.

Example

      '#'⎕wi'defaultFont'
16 8 [MS Shell Dlg] 13 {Label Caption} 65 {WMXwmxiiii} 56
      ]display '#'⎕wi'defaultFont'
.→--------------------------------------------------------.
∣16 8 [MS Shell Dlg] 13 {Label Caption} 65 {WMXwmxiiii} 56∣
'---------------------------------------------------------'
      ⎕dr '#'⎕wi'defaultFont'
82
More details...

Description

The scale property has been extended to support scalemode = 6 to return true pixels.

Example

      ←'ff'⎕wi'*Create' 'Form'
      'ff'⎕wi'scale'
1 0 0 29.03125 92.125
      'ff'⎕wi'scale'6
      'ff'⎕wi'scale'
6
More details...

Description

This version of the CSE implements a dual event channel so that custom event and routed events can be independently handled. This is necessary because APL+Win is a single-threaded application and the current version of the Microsoft SignalR server technology, used to contain the .Net portion of the CSE, now operates fully asynchronously. More details...

Description

The C# exception error message returned by the GetLastError method has been enhanced to include the exception message, exception stack trace, inner exception message, and inner exception stack trace. More details...

Description

This property controls the way that APL+Win sends text array information to the CSE. More details...

Description

Improvements in the CSE documentation have been implemented. Additional CSE examples have been developed. Some examples have been modified from prior versions to properly operate in this version of the CSE. which may be modified in a future version of the CSE. The complete list of modified examples are listed in the APL+Win C# Script Engine Update_v3.0.24.0.pdf. More details...

Description

  • The CSE installer has been updated: “APLNext CSE Components Setup v3.0.24.0.msi”. Before running the CSE installer check the file’s properties to be sure it is not ‘blocked’. The CSE installer registers ActiveX components of the CSE on the target workstation, therefore elevated privileges are required to properly install the CSE.
  • The CSE installer has been updated: “APLNext CSE Components Setup v3.0.24.0.msi”. Before running the CSE installer check the file’s properties to be sure it is not ‘blocked’. The CSE installer registers ActiveX components of the CSE on the target workstation and puts .Net components in the Global Assembly Cache, therefore elevated privileges are required to properly install the CSE.
  • The CSE installer will now install the CSE to a 32-bit or 64-bit version of the Windows operating system.
  • This version of the CSE requires APL+Win v17.0.01.
  • Features of the CSE which rely on accessing large memory spaces are not available when the CSE is installed in a 32-bit Windows operating system environment. Refer to CSE example #192.
More details...

Description

This means UTF-8 will be treated the same as UTF8. More details...

Description

This property controls when the APL+Win carriage return, ⎕TCNL, needs replacing with Windows carriage return in text transferred from APL+Win to a Windows file and vice versa. By default, the value of the usereplstr property is set to 1 to perform the character replacement. More details...

Description

Added [Config]LogCatch set to -1 to APLW.INI configuration file to improve ⎕WCALL and ⎕WI exception handling. More details...

Description

There is a new configuration setting [Config]VirtualPixels that controls whether scalemode=5 units are virtualized for DPI scaling or unscaled pixels;
1 (default) means virtual pixels are scaled to the current DPI level
0 means not scaled. More details...

Description

The APL2000 Draw Control item has been added to the Help menu for opening the APL2000 Draw ActiveX Control; Help file More details...

Description

The new ⎕cm left argument allows to specify the line separator character

Example

      ':'⎕cm'France:Italy:USA:Japan'
France
Italy
USA
Japan
      ':,'⎕cm':France,Italy,,USA:Japan'

France
Italy

USA
Japan
More details...

Description

The new ⎕cn left argument allows to specify the line separator character

Example

      ]display ','⎕cn'APL, is, easy'
.→3---------------.
∣.→3-..→3-..→5---.∣
∣∣APL∣∣ is∣∣ easy∣∣
∣'---''---''-----'∣
'∊----------------'
      ]display ',:'⎕cn'APL  :is,   easy'
.→3------------------.
∣.→5---..→2..→7-----.∣
∣∣APL  ∣∣is∣∣   easy∣∣
∣'-----''--''-------'∣
'∊-------------------'
More details...

Description

The [Session]SearchSelOnly allows to auto-check or not the Find and Replace "Selected Text Only" radio button More details...

Description

These speedups are in the 10 times faster range when using floating point arguments with at least 1000 elements More details...

Description

This new menu item in the APL+Win Edit menu has 6 sub menu items with shortcut keys to make it easier and faster to navigate in the editor. More details...

Description

This new menu item in the APL+Win Edit menu has 6 sub menu items with shortcut keys to allow expanding, collapsing and toggling regions in the editor. More details...

Description

The shortcut keys for "Match Parens" and "Match and Tag Parens" APL+Win Edit menu options have been changed. More details...

Description

The Unique (∪) primitive now supports scalar arguments

Example

      ∪2
2
      ∪⊂'APL'
 APL
      ∪⊂3 3⍴10,(⊂2 2⍴⍳4),20 30 40
    10    1 2   20
          3 4

    30     40   10

   1 2     20   30
   3 4
More details...

Description

The APL+Win Options / Color dialog has been extended with several options corresponding to recently added APL+Win features. More details...

Description

The APL+Win Editor now supports a new syntax color highlighting of matching elements: just select a element like a Control Structure, a variable, a paren, a system variable, ... in the editor and the matching element(s) are automatically highlighted with the same highlight color. More details...

Description

It is now possible to create, collapse and expand regions in the Editor like in most modern editors.

Example

    ∇ Test
[1]   ⍝ All regions are collapsible
[2]   ⍝ and expandable.  The Edit menu
[3]   ⍝ includes options for collapsing
[4]   ⍝ expanding all regions at once, etc.
[5]
[6]   :region
[7]       ⍝ APL Code
[8]       ⍝ here...
[9]   :endregion
[10]
[11]  :region---------RegionName
[12]      ⍝ Regions can have a name
[13]      ⍝ APL code here
[14]  :endregion
[15]
[16]  ⍝ Regions allow to navigate faster
[17]  ⍝ and much more easily in large APL
[18]  ⍝ functions, as well as to
[19]  ⍝ concentrate on the parts of the
[20]  ⍝ functions you are working on!
    ∇
More details...

Description

APL+Win now supports using Hexadecimal numbers (i.e. 0x3FE is the same as 1022, etc.) and Binary numbers (use 0b prefix).

Example

      ⍝ hexadecimal numbers
      0x0
0
      0x000000000
0
      0x01
1
      0xFF
255
      0xff   ⍝ case insensitive
255
      0xfffffff
268435455
      0xffffffff
¯1
      ⍝ can be used with primitives
      ⍝ and system functions
      0xAB 0x45
171 69
      +/0xAB 0x45
240
      +/171 69
240
      ⎕dr'0xA' 
82
      ⎕dr 0xA
323
      ⎕dr 0xfffffffffffffff
645
      ⎕dr ⎕←0xfffffffffffffff
1.152921505E18
645
      ⎕vi'0xff'
1
      ⎕fi'0xff'
255

      ⍝ binary numbers: use 0b prefix
      0b000001
1
      0b000010
2
      0b111111
63
      0b000010×0b111111
126
More details...

Description

The ⎕cn System Function is used to normalize any character argument into a nested vector of character arrays

Example

      ⍝ no left arg = no split
      ⎕cn'APL C# Javascript jQuery'
 APL C# Javascript jQuery
      ]display ⎕cn'APL C# Javascript jQuery'
.→1------------------------.
∣.→24---------------------.∣
∣∣APL C# Javascript jQuery∣∣
∣'------------------------'∣
'∊-------------------------'

      ⍝ left arg required to split right arg
      ' '⎕cn'APL C# Javascript jQuery'
 APL C# Javascript jQuery
      ]display' '⎕cn'APL C# Javascript jQuery'
.→4---------------------------.
∣.→3-..→2..→10-------..→6----.∣
∣∣APL∣∣C#∣∣Javascript∣∣jQuery∣∣
∣'---''--''----------''------'∣
'∊----------------------------'

      ⍝ extra spaces yield extra elements
      ' '⎕cn'APL   C# Javascript  jQuery'
 APL   C# Javascript  jQuery
      ]display ' '⎕cn'APL   C# Javascript  jQuery'
.→7------------------------------------.
∣.→3-..⊖..⊖..→2..→10-------..⊖..→6----.∣
∣∣APL∣∣ ∣∣ ∣∣C#∣∣Javascript∣∣ ∣∣jQuery∣∣
∣'---''-''-''--''----------''-''------'∣
'∊-------------------------------------'

      ⍝ make right arg a nested vector
      ⎕cn (⊃'APL' 'C#') 'Javascript' (2 2 6⍴'Java  PythonF#    HTML  ')
 APL C# Javascript Java Python F# HTML
      ]display ⎕cn (⊃'APL' 'C#') 'Javascript' (2 2 6⍴'Java  PythonF#    HTML  ')
.→7-------------------------------------------.
∣.→3-..→2..→10-------..→4--..→6----..→2..→4--.∣
∣∣APL∣∣C#∣∣Javascript∣∣Java∣∣Python∣∣F#∣∣HTML∣∣
∣'---''--''----------''----''------''--''----'∣
'∊--------------------------------------------'
More details...

Description

The APLW.WS ActiveX Server object now supports being instantiated by a 32-bit non-APL+Win client application. More details...

Description

The updated APLW.EXE Manifest files have been updated to allow the GetVersionEx function to return the correct 6.3 version number for Windows 8.1 and Windows Server 2012 R2. More details...

Description

The ⎕fx System F>unction now accepts a nested vector of character vectors as its argument.

Example

      ⎕fx'a←Square a' 'a←a*2'
Square

      ⎕vr'Square'
    ∇ a←Square a
[1]   a←a*2
    ∇

      ⍝ previously, needed ⊃[2]:
      ⎕fx ⊃[2]'a←Square a' 'a←a*2'
Square

      ⎕vr'Square'
    ∇ a←Square a
[1]   a←a*2
    ∇
More details...

Description

The Random Link System Function has been updated to support several new pseudo-random generation algorithms (Extended Historical Multiplicative Linear Congruential Multiplier, Mersenne Twister, Subtract with Carry).

Example

      )clear
CLEAR WS

      ⍝ Using Mersenne Twister 19937
      ⍝ algorithm (¯1) and the current
      ⍝ hhmmss time to ensure numbers
      ⍝ are not the same in each new
      ⍝ APL Session
      ⎕rl←¯1 ⍬ (100⊥3↑3↓⎕ts)
      ?10⍴10
6 2 7 6 6 1 6 3 8 1
      ?10⍴10
2 1 10 7 4 3 1 10 8 3
      ?10⍴10
4 6 4 3 2 3 1 10 4 2

      )clear
CLEAR WS
      ⎕rl←¯1 ⍬ (100⊥3↑3↓⎕ts)
      ?10⍴10
3 1 10 8 3 4 6 4 3 2
      ?10⍴10
3 1 10 4 2 2 4 10 5 7
      ?10⍴10
8 6 3 6 9 5 5 9 7 1

      ⍝ See the APL+Win documentation
      ⍝ or Help File for more details
More details...

SendInput (v15.0.01)

Description

The SendInput 32-bit API Windows function has been added to the APLWADF.INI and APLW.ADF files.

Example

      ⍝ Here is the definition of the
      ⍝ SendInput 32-bit API function 
      ⍝ in the APLWADF.INI file:

      ⎕wcall'W_Ini' '[Call]SendInput'
U(U nInput, *C pInput, I cbSize) LIB USER32
More details...

New : primitive (v15.0.01)

Description

The colon (:) character followed by a space at the beginning of any statement in a user defined function suppresses any output this line would otherwise produce.

Example

    ∇ Test
[1]   'ff'⎕wi'*Create' 'Form'('scale'5)('size'180 220)
[2]   'ff'⎕wi'.ed.Create' 'Edit'('where'10 10 20 200)
[3]   'ff'⎕wi'.bn.Create' 'Button'('where'35 10 20 100)
[4]   'ff'⎕wi'Wait'
    ∇

    Test
ff
ff.ed
ff.bn
0

    ∇ Test
[1]   : 'ff'⎕wi'*Create' 'Form'('scale'5)('size'180 220)
[2]   : 'ff'⎕wi'.ed.Create' 'Edit'('where'10 10 20 200)
[3]   : 'ff'⎕wi'.bn.Create' 'Button'('where'35 10 20 100)
[4]   : 'ff'⎕wi'Wait'
    ∇

    Test
More details...

Description

The monadic Sink primitive (←) suppresses the output from any instruction in an APL function or in the APL Session.

Example

    ∇ Test
[1]   'ff'⎕wi'*Create' 'Form'('scale'5)('size'180 220)
[2]   'ff'⎕wi'.ed.Create' 'Edit'('where'10 10 20 200)
[3]   'ff'⎕wi'.bn.Create' 'Button'('where'35 10 20 100)
[4]   'ff'⎕wi'Wait'
    ∇

    Test
ff
ff.ed
ff.bn
0

    ∇ Test
[1]   ←'ff'⎕wi'*Create' 'Form'('scale'5)('size'180 220)
[2]   ←'ff'⎕wi'.ed.Create' 'Edit'('where'10 10 20 200)
[3]   ←'ff'⎕wi'.bn.Create' 'Button'('where'35 10 20 100)
[4]   ←'ff'⎕wi'Wait'
    ∇

    Test
More details...

Description

The new ⎕guid (Globally Unique Identifier) System Function returns a GUID string which is a string having a high degree of certainty to be unique. It can be used for many different purposes like for being table records Primary Keys in databases, etc.

Example

      ⎕guid
{BD5C34AF-81E0-4664-8DEA-C036512FE692}
      ⎕guid
{5EB2BEA2-7687-4EAC-B3CE-5E2451E04EC7}
      ⎕guid
{A14DC64A-B2BD-4EF3-8681-F446EB4A952A}
      ⎕guid
{5DA6BE6A-CC62-4712-99BC-6F9E0F8E4413}
More details...

Description

The new ⎕cm Character Matrix System Function can be used to normalize any character argument into a character matrix result.

Example

      ⎕cm'abc'(2 2⍴'DEFG')('hello',⎕tcnl,'world!')
abc
DE
FG
hello
world!
      ':'⎕cm'APL:is:easy'
APL
is
easy
      ':'⎕cm':APL::is:easy'

APL

is
easy
      ':;,'⎕cm':APL;is,easy'

APL
is
easy
More details...

Description

The new ⎕cv Character Vector System Function can be used to normalize any character argument into a character vector result. It is especially useful to create segmented strings.

Example

      ⎕cv'D'⎕nl 3
Div
Divides

      ⍴⎕cv'D'⎕nl 3
11

      ⎕tcnl=⎕cv'D'⎕nl 3
0 0 0 1 0 0 0 0 0 0 0

      ','⎕cv'C'⎕nl 3
CLIPCopy,CLIPFmt,CLIPPaste,CLIPUnfmt

      ' '⎕cv'APL' 'is' 'easy!'
APL is easy!

      ⍴' '⎕cv'APL' 'is' 'easy!'
12

      ':'⎕cv('D'⎕nl 3)'APL' 'easy!'('yes',⎕tcnl,'no')
Div:Divides:APL:easy!:yes:no
More details...

Description

The new ⎕crlf System Function returns ⎕tcnl,⎕tclf and is a possible convenient left argument to the new ⎕cv System Function to produce standard Windows delimited character strings. It is equivalent to the \r\n in C/C++/C#.

Example

      ⎕crlf ⎕cv'apl' 'is' 'easy'
apl

is

easy

      (⎕tcnl,⎕tclf)∘.=⎕crlf ⎕cv'apl' 'is' 'easy'
 0 0 0 1 0 0 0 1 0 0 0 0 0
 0 0 0 0 1 0 0 0 1 0 0 0 0

      ⎕crlf∘.=⎕crlf ⎕cv'apl' 'is' 'easy'
 0 0 0 1 0 0 0 1 0 0 0 0 0
 0 0 0 0 1 0 0 0 1 0 0 0 0
More details...

Description

The handling or error messages produced by the APL+Win ActiveX Server (APLW.WSEngine and APLW.WS) XCall and XSysCall methods has been improved More details...

Description

Using Ctrl+Click instead of Click on an APL+Win MRU (Most Recently Used) file in the File menu now XLOADs the workspace instead of LOADing it and thus does not execute its ⎕lx latent expression. More details...

Description

The ]upack User Command now support file names having spaces in their names (long file names). More details...

Description

The ]unames User Command /since option now supports years > 2000 and support case insensitive months.

Example

      ⎕pw←60

      ⍝ display all objects (fns and
      ⍝ vars) updated in the User 
      ⍝ Command file since 1 jan16

      ]znames /since 1 dec 16
Version∇                  zRibbonForm∇
zForm∇                    zzform3∇
zObject∇                  zzlcchart101∇
zRibbonDXForm∇            zzribbondxform∇
More details...

Description

The support for in-place assignment (i.e. a⍟←b being equivalent to a←a⍟b) has been extended to all dyadic scalar primitives plus, minus, times, divide, maximum, minimum, ..., and, or, ...).

Example

      ⍝ inplace assignment was already 
      ⍝ working with catenation (,)
      html←'<html>'
      html,←'<head/>'
      html,←'<body>'
      html,←'<h1>Hello APL!</h1>'
      html,←'</body>'
      html,←'</html>'

      html
<html><head/><body><h1>Hello APL!</h1></body></html>

      ⍝ it now works with dyadic scalar
      ⍝ primitives
      aaa←10
      ⎕←aaa+←20
30
      ⎕←aaa×←1 2 3
30 60 90
      ⎕←aaa÷←10
3 6 9
      ⎕←aaa⌈←7
7 7 9
      ⎕←aaa*←2
49 49 81
More details...

Description

The ]usave User Command does no longer save ⎕mom and ⎕ucs objects in User Command Files. More details...

Description

The new ⎕nfe System Function supports reading and writing text files using different encoding types. More details...

Description

The maximum number of retainable APL+Win Session lines has been increased from 8000 to 32767. More details...

Description

The ⎕dtr System Function now supports empty prototypes. More details...

Description

The new ]pcfread User Command reads components from n APL*PLUS PC .ASF components file. More details...

Description

The APL+Win ActiveX Server now returns an exit code to its calling batch process. More details...

Description

The APLWin ActiveX Server class has a new apldata property that controls how character data is transmitted by the Server. More details...

Description

The new APLW.WS ActiveX Server class allows to start any APL+Win executable as the APL+Win ActiveX Server with any user specified command options. More details...

Description

The Inline Control Sequences (see v10 enhancements) are no longer experimental and are enabled by default in the Full and Runtime system.

Example

      ∇ r←Test a
[1]   (~a∊⍳3 :then ⎕error'a must be 1,2 or 3')
[2]   (a=2 :then 'a is 2' :else 'a is 1 or 3')
[3]   r←(a :choose 'one' : 'two' : 'three')
    ∇

      Test 3
a is 1 or 3
three

      Test 2
a is 2
two

      Test 5
a must be 1,2 or 3
      Test 5
      ^
More details...

Description

The Enlist (∊) primitive has been optimized for all types of simple vectors enclosed in a nested singleton (or empty) vector. More details...

Description

The new ⎕cse System Function allows to include C# code into APL+Win programs and allows to use the entire Microsoft .Net Framework from APL+Win. More details...

Description

The new XUExec method of the APL+Win ActiveX Server class allows to return a Variant value from a Unicode aware client application. More details...

Description

The Windows Visual Styles (Themes) are now supported in ⎕wi controls and in the APL+Win Session for the APL+Win Full System and Runtime System thanks to the new aplw.exe.manifest and aplwr.exe.manifest files. More details...

Description

There is a new shortcut key (Alt+Shift+W) to produce the Euro (€) symbol. More details...

Description

The WinVersion and GetWinVer utility functions in the WINDOWS.W3 and RELxx.W3 workspace have been enhanced to support Windows 8 and Windows Server 2012. More details...

Description

The new Mismatch (≢) primitive (Alt+Shift+Q) is equivalent to Not Match. More details...

Description

The new Commute (⍨) operator (Alt+Shift+T) allows to reverse the arguments of a primitive before applying it. Therefore, (a+b)-c can be written: c-⍨a+b
The Commute operator often allows to eliminate parenthesis in APL+Win expressions. More details...

Description

The new Commute (⍨) operator (Alt+Shift+T) allows to reverse the arguments of a primitive before applying it. Therefore, (a+b)-c can be written: c-⍨a+b
The Commute operator often allows to eliminate parenthesis in APL+Win expressions.

Example

      ⍝ Expression:     ⍝ Same as:
      ⎕tcnl~⍨⎕vr'Test'  (⎕vr'Test')~⎕tcnl
      10÷⍨9-3           (9-3)÷10
      c⍴⍨a,b            (a,b)⍴c
      10-⍨c⍴⍨a,b        ((a,b)⍴c)-10
More details...

Description

The new Mismatch (≢) primitive (Alt+Shift+Q) is equivalent to Not Match.

Example

      ⎕av⍳'APL'
66 81 77

      'APL'≢⎕av[66 81 77]
0
      'APL'≡⎕av[66 81 77]
1

      ⍳¨⍳3
 1  1 2  1 2 3

      (⍳¨⍳3)≢1,(⊂1 2),⊂1 2 3
1     ⍝ they are not identical!

     ]display 1,(⊂1 2),⊂1 2 3
.→3-------------.
∣   .→2-..→3---.∣
∣ 1 ∣1 2∣∣1 2 3∣∣
∣   '~--''~----'∣
'∊--------------'

      ]display ⍳¨⍳3
.→3-------------.
∣.→..→2-..→3---.∣
∣∣1∣∣1 2∣∣1 2 3∣∣
∣'~''~--''~----'∣
'∊--------------'
More details...

Description

The APL+Win Virtual Keyboard now provides 2 new checkbox options: Virtual Key Regions are Active and Tool Tips are active. More details...

Description

The ⎕pw System Variable now accepts an argument of ¯1 to programmatically force ⎕pw to match the APL+Win Session width.

Example

      ⍝ restrict output to 60 chars width
      ⎕pw←60

      ⍝ restrict output to apl session width
      ⎕pw←¯1 
More details...

Description

The new :foreach Control Structure allows to iterate several items in parallel in a for loop.

Example

    ∇ Test;a;i;j;k;l;w
[1]   a←'dog' 'cat' 'bird' ⍝ animals
[2]   l←12 18 6            ⍝ avg life length
[3]   w←30 16 2            ⍝ avg weight
[4]   :foreach i j k :in a l w
[5]       ⎕←i'can live'j'and weigh'k
[6]   :endfor
    ∇

      Test
 dog can live 12 and weigh 30
 cat can live 18 and weigh 16
 bird can live 6 and weigh 2
More details...

Description

The Open... (Ctrl+O) and Fetch... (Ctrl+G) dialogs now have a Contains check box: when checked typing characters in the Name field reduces the list of objects to only those containing these characters. More details...

Description

The Zip ActiveX Class can now recurse subdirectories
TheZip ActiveX Class can now use pattern matching. More details...

Description

The ⎕dr System Function now supports ⎕mom and ⎕ucs objects.

Example

      mypet←⎕mom'' '' ⍝ create new ⎕mom object
      mypet.Name←'zazou'
      mypet.⎕fx⊃'r←Jumped a' 'r←⎕mself.Name"jumped"((1+a>2)⊃"low" "high")' 
Jumped

      mypet.Jumped 4
 zazou jumped high

      mypet.Jumped 1
 zazou jumped low

      ⎕dr mypet
99999   ⍝ 99999=⎕mom object!

      ⎕dr ⎕ucs 2345 6789
322     ⍝ 322=⎕ucs object
More details...

Description

There now is a new Virtual APL Keyboard GUI control in the session manager available by clicking the View/APL keyboard menu option or pressing Ctrl+B. More details...

Description

There now is a new APL Idioms Manager GUI control in the session manager available by clicking the View/Idioms Manager menu option or pressing Ctrl+I. More details...

Description

Using Ctrl+scrolling mouse wheel now allows to easily change the APL+Win font size. More details...

Description

The grade-up (⍋) and grade-down (⍒) primitive functions now has ⎕AV as their default character grade left argument.

Example

      ⍋4 3⍴'cccaaadddbbb'
 2 4 1 3
      ⍝ previously:
      ⎕av⍋4 3⍴'cccaaadddbbb'
 2 4 1 3 
More details...

Description

The ⎕CMD System Function now supports a command line buffer length of 8192 characters instead of the previous 256 characters. More details...

Description

Unicode characters are now supported in the Draw method Text operations and in the Printer object Print method.

Example

      ⎕wi'Draw'('Text'(⎕ucs 97 98 99))
      ⍝ Same as:
      ⎕wi'Draw'('Text' 'abc')

      ⎕wi'Draw'('Text'(⎕ucs 9076))
      ⍝ Would draw: ⍴
      ⍝ See:
      ⍝ https://unicode¯table.com/en
      ⍝ https://unicode¯table.com/en/#miscellaneous¯technical
      ⍝ for a list of Unicode characters

      ⍝ To convert hexa¯decimal numbers
      ⍝ since v15.1:

      0x2374 ⍝ code in above page for ⍴
9076         ⍝ decimal value for this code

      ⍝ Equivalent instructions:
      'printer'⎕wi'Print' 'abc'
      'printer'⎕wi'Print'(⎕ucs 97 98 99)
      'printer'⎕wi'Print'97 98 99
More details...

Description

The APL+Win Session and the APL+Win Editor now supports multi-level Undo (Ctrl+Z) and/or Redo (Ctrl+Y). More details...

DefaultES (v10.3)

Description

A new INI file setting named [Session]DefaultES=n allows specification of the default Event Stop setting for an APL+Win Session. More details...

Description

The [Session]DefaultES=n setting controls the default state of Event Stops for APL+Win ActiveX Server Sessions. More details...

Description

A new notation (<) has been introduced that allows passing ActiveX objects as arguments to ActiveX Methods in a more convenient and efficient manner.

Example

'xsl'⎕wi'Create' 'Msxml2.DOMDocument'
'xml'⎕wi'Load' 'c:\temp\contacts.xml'
'xsl'⎕wi'Create' 'Msxml2.DOMDocument'
'xsl'⎕wi'Load' 'c:\temp\contactsStyleSheet.xslt'
'xml'⎕wi'TransformNode' ('xsl'⎕wi'obj')

⍝ The last instuction can now be:
'xml'⎕wi'TransformNode(<xsl)'

⍝ or with named parameters:
'xml'⎕wi'TransformNode (stylesheet:<xsl)'
More details...

Description

The new onComAction event on the System Object only fires in the APL+Win ActiveX Server Session and is useful for debugging and/or tracing error purposes. More details...

Description

Setting of Stop or Trace in an APL+Win function Edit Session now takes effect immediately. More details...

Description

It is now possible to edit a character variable by opening it at a given line number in the APL+Win Editor.

Example

      aaa←⊃(⊂'Item '),¨⍕¨⍳100
      )ed aaa[78]
More details...

Description

The new ⎕dtr System Function performs a deep transpose of any array: it works as the monadic transpose but recurses to each child element and transposes it as well. This System Function is very useful when passing arrays to an ActiveX method as arrays needs to be deeply transposed in that case.

Example

      aaa←?2 2⍴⊂2 2⍴100

      aaa
 14 76   22  5
 46 54   68 68

 94 39    4  6
 52 84   53 68

      ⎕dtr aaa
 14 46   94 52
 76 54   39 84

 22 68    4 53
 5 68     6 68 
More details...

Description

APL+Win now supports arrays with about 10 times more elements than before.

Example

      aaa←2147483647⍴1
      ⍴aaa
 2147483647
      ⍝ 2.147483647 billion elements!
      +/aaa
 2147483647 
More details...

Description

The runtime system (aplwr.exe) no longer restricts the kind of workspace it can load. Now it can load workspaces that were created via either the )SAVE and )RSAVE system commands without any differences in behavior except that runtime workspaces are encrypted. This enhancement only applies to runtime workspaces created in APL+Win v10.0+. More details...

Description

The :for Control Structure statement now supports multiple variables strand notation.

Example

    ∇ Test;i;j;k
[1]   :for i j k :in (1 2 3)(4 5 6)
[2]       ⎕←i j k*2
[3]   :endfor
    ∇

      Test
1 4 9
16 25 36
More details...

Description

The ⎕at and ⎕size System Functions now accept an additional optional scope left argument as follows:

1=local scope (default)
0=global scope

Example

    ∇ Test aaa
[1]   0 0⍴⍙stop⎕stop'Test'
[2]   ⍙stop:
    ∇

      aaa←⍳100000

      Test ⍳10
Test[2]

      ⍝ size of the local aaa variable
      ⎕size'aaa'
64
      1 ⎕size'aaa'
64

      ⍝ size of the global aaa variable
      0 ⎕size'aaa'
400024
More details...

Description

The ⎕dm System Variable may now be localized in function headers and may be assigned.

Example

    ∇ r←a Div b;⎕dm
[1]   :try
[2]       r←a÷b
[3]   :catchif'DOMAIN'≡6↑⎕dm
[4]       ⎕dm←'Division par 0 impossible!'
[5]       ⎕error⎕dm
[6]   :endtry
    ∇

      5 Div 6
0.8333333333

      5 Div 0
Division par 0 impossible!
      5 Div 0
        ^
More details...

Description

The Enable Unicode Clipboard item to the Edit menu (near where it lists Cut, Copy, Paste) when enabled (checked) allows Unicode text containing APL characters to paste into and from APL+Win.
This is bound to the Ctrl+U key for toggling Unicode clipboard mode on/off. There is also a UNI indicator in the status bar when this option is enabled.

This important new feature now allows to copy/paste APL code directly in other applications like Word, Outlook, etc. without having to use an APL font! More details...

Description

Tabs are now treated syntactically the same as SPACEs when not within quotes. Inside quotes they have always been included into the string's value and that behavior remains unchanged. They only cause SYNTAX ERRORs when used to indent code or comments (which often happened as a result of pasting from another application that inserts tabs rather than spaces into the code). More details...

Description

The new :nextcase Control Structure allows to continue execution with the next :case in a :select ... :case ... :case ... :endselect structure while otherwise only one :case block would be executed.

Example

    ∇ Test n
[1]   :select n
[2]   :case 3
[3]      ⎕←'case 3'
[4]      :nextcase
[5]   :case 2
[6]      ⎕←'case 2'
[7]      :nextcase
[8]   :case 1
[9]      ⎕←'case 1'
[10]  :else
[11]     ⎕←'else'
[12]  :endselect
    ∇
 
      Test 0
else
      Test 1
case 1
      Test 2
case 2
case 1
      Test 3
case 3
case 2
case 1
More details...

Description

The :ex Control Structure statement is used in cascading decision statements (such as: :and/:or extensions of :if, :while, etc.) statements as a place to compute something before taking the next decision.

Example

    ∇ a Test b;c
[1]   :if a>4
[2]   :and b>5
[3]   :ex c←a×b
[4]   :and c<40
[5]       ⎕←'Success!'
[6]   :else
[7]       ⎕←'Failure!'
[8]   :endif
    ∇

      5 Test 6
Success!

      5 Test 7
Success!

      5 Test 8
Failure!
More details...

Description

The :return Control Structure statement is the same as →0. It can also accept one argument which is the value to be returned by the function: in this case the function must have been declared to have a result.

Example

    ⎕vr'Test'
    ∇ Test a
[1]   :return a
    ∇

      Test 10
NONCE ERROR: Cannot return value without declared result
Test[1] :return a
        ^

    ∇ r←Test a
[1]   :return a
[2]   ⍝ Same as:
[3]   ⍝ r←a
[4]   ⍝ :return
    ∇

      Test ⍳5
1 2 3 4 5
More details...

Description

The :returnif Control Structure statement has the following syntax:

:returnif (condition) :res (result)

It continues execution if (condition) evaluates to 0 and exit the function returning (result) if (condition) evaluates to 1.

Example

    ∇ r←Test a
[1]   :returnif a>10 :res a*2
[2]   :return a*3
    ∇

      Test 12
144
      Test 3
27
More details...

Description

The :leaveif Control Structure statement allows to quit a loop based on a condition with one statement.

Example

    ∇ r←Test;a;i
[1]   ⎕←a←?10⍴10
[2]   :for i :in a
[3]       :leaveif i>7
[4]       ⍝ Alternative:
[5]       ⍝ :if i>7 ⋄ :leave ⋄ :end
[6]       ⎕←i
[7]   :endfor
    ∇

      Test
7 4 1 10 6 1 9 1 4 5
7
4
1
More details...

Description

The :continueif Control Structure statement has the following syntax:

:continueif (condition)

It allows to skip the end of the current loop if (condition) evaluates to 1.

Example

    ∇ r←Test;a;i
[1]   ⎕←a←?10⍴10
[2]   :for i :in a
[3]       :continueif i>5
[4]       ⍝ Alternative:
[5]       ⍝ :if i>5 ⋄ :continue ⋄ :end
[6]       ⎕←i
[7]   :endfor
    ∇

      Test
6 8 7 6 1 2 10 2 4 7
1
2
2
4
More details...

Description

The Inline Control Structures (ICS) allow to express in a single instruction what would require several instructions with regular Control Structures.

ICS must be embedded in parenthesis and may return a result.

The various available ICSs are the following:

(cond :then case1 :else case0)
(cond :then case1)
(cond :else case0)
(cond1 :and cond2)
(cond1 :and cond2 ... :and condN)
(cond1 :and cond2 ... :then case1 :else case0)
(cond1 :and cond2 ... :then case1)
(cond1 :and cond2 ... :else case0)
(index :choose case1 : ... : caseN :else else)
(index :choose case1 : ... : caseN)

Example

    ∇ r←Test a
[1]   (~a∊⍳3 :then ⎕error'a must be 1,2 or 3')
[2]   (a=2 :then 'a is 2' :else 'a is 1 or 3')
[3]   r←(a :choose 'one' : 'two' : 'three')
    ∇

      Test 3
a is 1 or 3
three

      Test 2
a is 2
two

      Test 5
a must be 1,2 or 3
      Test 5
      ^
More details...

Description

The :debug statement argument is executed only in debug mode without displaying any result to the APL+Win Session.

Example

    ∇ Test
[1]   :debug aaa←⍳10
[2]   :debug aaa   ⍝ no session output
[3]   :debug ⎕←2×aaa  ⍝ session output
[4]   :debug 10+
[5]   :debug ⎕←100
    ∇

      )debug
IS ON

      Test
 2 4 6 8 10 12 14 16 18 20
SYNTAX ERROR
Test[4] :debug 10+
                 ^

      )si
Test[4] *

      )debug off
WAS ON
1 function(s) required reflowing
1 function(s) successfully reflowed

      Test
More details...

Description

The ifdebug statement defines a block of statements that execute in debug mode only. It must end with an :endifdebug, :endif, or :end statement. It can be coded with or without an :else clause, which executes in release mode, with additional conditions, or a combination of both.

Example

    ∇ Test
[1]   :ifdebug
[2]       aaa←⍳10
[3]       aaa      ⍝ session output
[4]       ⎕←2×aaa  ⍝ session output
[5]       10+
[6]       ⎕←100
[7]   :else
[8]       aaa←⌽⍳10
[9]   :end
    ∇

      )debug
IS ON

      Test
 1 2 3 4 5 6 7 8 9 10
 2 4 6 8 10 12 14 16 18 20
SYNTAX ERROR
Test[5]     10+
              ^
      )si
Test[5] *

      )debug off
WAS ON
1 function(s) required reflowing
1 function(s) successfully reflowed

      aaa
 1 2 3 4 5 6 7 8 9 10

      Test

      aaa
 10 9 8 7 6 5 4 3 2 1 
More details...

Description

The :trace Control Structure statement implicitly calls the ⎕log System Function to write its argument's value to the debug log file but the argument expression is not required to return a value (if it does not, nothing is written the debug log file). More details...

Description

The :assert Control Structure statement executes its argument only in debug mode. It evaluates its argument and signals an error if the argument does not return 1 or an empty character vector ('')

Example

    ∇ Test
[1]   ⎕←aaa←?(?10)⍴10
[2]   :assert (⍴aaa)>5
    ∇

      )debug
IS ON

      Test
 3 2 4 9 7 2 7 4 4 5
      Test
 10 6 2 10 5 2
      Test
 1 3
ASSERTION FAILURE: (⍴aaa)>5
Test[2] :assert (⍴aaa)>5
        ^

      ⎕vr'Test'
    ∇ Test
[1]   ⎕←aaa←?(?10)⍴10
[2]   :assert (⍴aaa)>5 :else 'aaa must have at least 6 elements!'
    ∇

      Test
 3 5 5 10 2 2

      Test
 7 2 7 7
ASSERTION FAILURE: aaa must have at least 6 elements!
Test[2] :assert (⍴aaa)>5 :else 'aaa must have at least 6 elements!'
                ^
More details...

Description

The :verify Control Structure statement executes its argument whether debug mode is on or off. It evaluates its argument and signals an error if the argument does not return 1 or an empty character vector ('')

Example

    ∇ Test
[1]   ⎕←aaa←?(?10)⍴10
[2]   :verify (⍴aaa)>5
    ∇

      Test
3 5 4 3 1 10 5 2 10
      Test
2 9 1 2 1
ASSERTION FAILURE: (⍴aaa)>5
Test[2] :verify (⍴aaa)>5
        ^

      ⎕vr'Test'
    ∇ Test
[1]   ⎕←aaa←?(?10)⍴10
[2]   :verify (⍴aaa)>5 :else 'aaa must have at least 6 elements!'
    ∇


      Test
3 2 8 5
ASSERTION FAILURE: aaa must have at least 6 elements!
Test[2] :verify (⍴aaa)>5 :else 'aaa must have at least 6 elements!'
     ^
More details...

Description

System speed and memory capacticy have increased dramatically. Some applications run twice as fast as before.

The maximum workspace has grown from 1.6Gb to 2.6Gb or 3.6Gb (on 64-bits machines). More details...

Description

⎕wgive was enhanced to eliminate a lot of excess and unnecessary overhead when executed. More details...

Description

The ⎕novalue System Function may only be used with :return or :res. Using ⎕novalue with :return or :res means that the function will retun no value even if the function result variable has already been as signed!

Example

    ∇ r←Test a
[1]   r←a
[2]   :returnif a>4 :res ⎕novalue
    ∇

      ⎕←aaa←Test 3
3

      ⎕←aaa←Test 10
VALUE ERROR
      ⎕←aaa←Test 10
            ^

      ⍝ Even though r←a on line [1]
      ⍝ the function does not return
      ⍝ a value when a>4 because of
      ⍝ ⎕novalue
More details...

Description

The new ⎕throw System Function is similar to ⎕error except it throws the error in the context of the calling function rather than exiting from the function before throwing it. This allows errors thrown in a :try block to be handled locally rather than existing from the function. .

Example

     ∇ Test2
[1]   ⎕←4 Div2 3
[2]   ⎕←4 Div2 2
[3]   ⎕←4 Div2 0
    ∇

     ∇ r←a Div2 b
[1]   ⎕error(b=0)/"Can't divide by 0!"
[2]   r←a÷b
    ∇

      Test2
1.333333333
2
Can't divide by 0!
Test2[3] ⎕←4 Div2 0
             ^
      
      ⍝ Note: it is the Test2 calling
      ⍝ function which is interrupted

     ∇ Test
[1]   ⎕←4 Div 3
[2]   ⎕←4 Div 2
[3]   ⎕←4 Div 0
    ∇

     ∇ a←a Div b
[1]   ⎕throw(b=0)/"Can't divide by 0!"
[2]   a←a÷b
[3]
    ∇

      Test
1.333333333
2
Can't divide by 0!
Div[1] ⎕throw(b=0)/"Can't divide by 0!"
       ^

      ⍝ Note: this time, it is the Div
      ⍝ function which is interrupted

More details...

Description

⎕valence, ⎕monadic, and dyadic indicate how the current function was called. ⎕valence returns 0, 1, or 2 for niladic, monadic, or dyadic invocation or ¯1 if not a function (such as a callback). ⎕monadic is equivalent to (⎕valence=1) and ⎕dyadic is equivalent to (⎕valence=2).

Example

    ∇ r←a Divides b
[1]   :if ⎕monadic
[2]   ⍝ Alternatives:
[3]   ⍝ :if ⎕valence=1
[4]   ⍝ :if 0=⎕nc'a'
[5]    a←1
[6]   :endif
[7]   r←b÷a
    ∇

      Divides 5
5

      2 Divides 5
2.5
More details...

Description

The ⎕log function formats its right argument into a debug log file and/or the Windows Event Log. It may be called during debug or release mode. The log file is automatically created with a timestamp based filename and each entry in it is prefixed by a timestamp. Newline characters are normalized to the Windows CR+LF standard and APL characters are translated to ANSI to make the output viewable with any standard editor. If the EncryptLog option is enabled the log file is encrypted as it is written.

The optional left argument controls where the output is written. D selects the debug log file (default) while I, W, or E selects the Windows Event Log as Information, Warning, or Error events.

Example

      ⍝ Change the Log file
      ⎕wcall'W_Ini' '[Config]DebugLogPath=c:\temp\aplwin.log'

      ⍝ Exit APL and reload APL
      ⎕wcall'W_Ini' '[Config]DebugLogPath'
c:\temp\aplwin.log

    ∇ Test;a;b;i
[1]   a←¯5+?10⍴10
[2]   :trace a  ⍝ write to Log file
[3]   :for i :in⍳⍴a
[4]       :try *
[5]           b←÷i⊃a
[6]       :catchall
[7]           'D'⎕log⎕dm
[8]       :endtry
[9]   :endfor
    ∇

      Test

      'c:\temp\aplwin.log'⎕ntie ¯1
      aaa←⎕nread ¯1 82,2↑⎕nsize ¯1
      aaa←(ANSI2AV aaa)~⎕tclf
      aaa

###2017¯01¯13 15:49:51.457###
2 2 1 3 3 5 0 5 ¯1 0
###2017¯01¯13 15:49:51.457###
DOMAIN ERROR
Test[5]         b←÷i⊃a
                  ^
###2017¯01¯13 15:49:51.457###
DOMAIN ERROR
Test[5]         b←÷i⊃a
                  ^
More details...