Consistent Extensions in NARS2000: Difference between revisions

From NARS2000
Jump to navigationJump to search
No edit summary
No edit summary
Line 2: Line 2:


== Language Features ==
== Language Features ==
* Sink:  monadic left arrow (<apl size="large">←</apl>), e.g. <apl size="large">←A</apl> suppresses the display of <apl size="large">A</apl>.
* Sink:  monadic left arrow (<apll>←</apll>), e.g. <apll>←A</apll> suppresses the display of <apll>A</apll>.
* Unified index reference, assignment, and modify assignment (<apl size="large">R[L]</apl>, <apl size="large">R[L]←A</apl>, and <apl size="large">R[L]</apl>'''''fn'''''<apl size="large">←A</apl>):  these three forms all allow both Reach and Scatter indexing — that is, if <apl size="large">L⊃R</apl> is valid, it is equivalent to <apl size="large">⊃R[⊂L]</apl>, and if <apl size="large">L⌷R</apl> is valid, it is equivalent to <apl size="large">R[⊃∘.,/L]</apl> — Reach and Scatter indexing may appear together within a single instance of <apl size="large">R[L]</apl>, <apl size="large">R[L]←A</apl>, and <apl size="large">R[L]</apl>'''''fn'''''<apl size="large">←A</apl>.
* Unified index reference, assignment, and modify assignment (<apll>R[L]</apll>, <apll>R[L]←A</apll>, and <apll>R[L]</apll>'''''fn'''''<apll>←A</apll>):  these three forms all allow both Reach and Scatter indexing — that is, if <apll>L⊃R</apll> is valid, it is equivalent to <apll>⊃R[⊂L]</apll>, and if <apll>L⌷R</apll> is valid, it is equivalent to <apll>R[⊃∘.,/L]</apll> — Reach and Scatter indexing may appear together within a single instance of <apll>R[L]</apll>, <apll>R[L]←A</apll>, and <apll>R[L]</apll>'''''fn'''''<apll>←A</apll>.
* Dyadic operator jot (<apl size="large">∘</apl>) (composition) is used to join two functions or a function and a variable to produce a derived function (e.g., <apl size="large">,∘⍋∘⍋∘,</apl>) which is applied as a single function.  For example, the function <apl size="large">*∘2</apl> when applied monadically, squares its argument.
* Dyadic operator jot (<apll>∘</apll>) (composition) is used to join two functions or a function and a variable to produce a derived function (e.g., <apll>,∘⍋∘⍋∘,</apll>) which is applied as a single function.  For example, the function <apll>*∘2</apll> when applied monadically, squares its argument.
* Monadic operator null (<apl size="large">⊙</apl>):  To aid in resolving ambiguities with slash/slope as function/operator, use this operator.  It passes through all functions as functions, and forces the symbols slash/slope to be functions rather than operators.  For example, use <apl size="large">/⊙/3 4</apl> instead of <apl size="large">//3 4</apl>.
* Monadic operator null (<apll>⊙</apll>):  To aid in resolving ambiguities with slash/slope as function/operator, use this operator.  It passes through all functions as functions, and forces the symbols slash/slope to be functions rather than operators.  For example, use <apll>/⊙/3 4</apll> instead of <apll>//3 4</apll>.
* Monadic iota (<apl size="large">⍳</apl>) extended to negative indices.  For example, in origin-0, <apl size="large">⍳¯3</apl> returns <apl size="large">¯3 ¯2 ¯1</apl>.
* Monadic iota (<apll>⍳</apll>) extended to negative indices.  For example, in origin-0, <apll>⍳¯3</apll> returns <apll>¯3 ¯2 ¯1</apll>.
* Monadic iota (<apl size="large">⍳</apl>) extended to length > 1 vector right arguments returns an array of indices whose shape is that of the right argument (via an internal magic function).
* Monadic iota (<apll>⍳</apll>) extended to length > 1 vector right arguments returns an array of indices whose shape is that of the right argument (via an internal magic function).
* Dyadic iota (<apl size="large">⍳</apl>) extended to rank > 1 left arguments returns an array of vector indices to the left argument (via an internal magic function).
* Dyadic iota (<apll>⍳</apll>) extended to rank > 1 left arguments returns an array of vector indices to the left argument (via an internal magic function).
* Index reference, assignment, modify assignment, squad, and pick (<apl size="large">R[L]</apl>, <apl size="large">R[L]←A</apl>, <apl size="large">R[L]</apl>'''''fn'''''<apl size="large">←A</apl>, <apl size="large">L⌷R</apl>, and <apl size="large">L⊃R</apl>) are each extended to negative values in <apl size="large">L</apl>.  That is, if the largest allowed value is <apl size="large">N</apl>, then the allowable range for the values in <apl size="large">L</apl>  is <apl size="large">¯1-N</apl> to <apl size="large">N</apl>, inclusive.  For example, <apl size="large">A</apl>, <apl size="large">A[⍳⍴A]</apl>, and <apl size="large">A[⍳-⍴A]</apl> are all identical for any array <apl size="large">A</apl> in either origin.
* Index reference, assignment, modify assignment, squad, and pick (<apll>R[L]</apll>, <apll>R[L]←A</apll>, <apll>R[L]</apll>'''''fn'''''<apll>←A</apll>, <apll>L⌷R</apll>, and <apll>L⊃R</apll>) are each extended to negative values in <apll>L</apll>.  That is, if the largest allowed value is <apll>N</apll>, then the allowable range for the values in <apll>L</apll>  is <apll>¯1-N</apll> to <apll>N</apll>, inclusive.  For example, <apll>A</apll>, <apll>A[⍳⍴A]</apll>, and <apll>A[⍳-⍴A]</apll> are all identical for any array <apll>A</apll> in either origin.
* ± Infinity (e.g. <apl size="large">_</apl> for infinity and <apl size="large">¯_</apl> for negative infinity) — considerable development work needs to be done to this feature to handle the many special cases.
* ± Infinity (e.g. <apll>_</apll> for infinity and <apll>¯_</apll> for negative infinity) — considerable development work needs to be done to this feature to handle the many special cases.
* Monadic and dyadic domino (<apl size="large">⌹</apl>) — matrix inverse/divide extended to use Moore-Penrose pseudo-inverse algorithm via Singular Value Decomposition.
* Monadic and dyadic domino (<apll>⌹</apll>) — matrix inverse/divide extended to use Moore-Penrose pseudo-inverse algorithm via Singular Value Decomposition.
* Prototypes for all primitive functions and operators.
* Prototypes for all primitive functions and operators.
* Out of range numeric assignments to <apl size="large">⎕PP</apl> and <apl size="large">⎕PW</apl> are set to the value in the allowable range nearest the ceiling of the given number. For example, if <apl size="large">⎕PP</apl> is set to <apl size="large">23.7</apl>, that value is rounded down to <apl size="large">17</apl>, the largest value that system variable may assume.
* Out of range numeric assignments to <apll>⎕PP</apll> and <apll>⎕PW</apll> are set to the value in the allowable range nearest the ceiling of the given number. For example, if <apll>⎕PP</apll> is set to <apll>23.7</apll>, that value is rounded down to <apll>17</apll>, the largest value that system variable may assume.
* New System Variables
* New System Variables
** <apl size="large">⎕FC</apl> (Format Control)
** <apll>⎕FC</apll> (Format Control)
** <apl size="large">⎕IC</apl> (Indeterminate Control)
** <apll>⎕IC</apll> (Indeterminate Control)
* New System Functions
* New System Functions
** <apl size="large">1 ⎕CR R</apl> (Canonical Representation -- vector result) and <apl size="large">2 ⎕CR R</apl> (matrix result)
** <apll>1 ⎕CR R</apll> (Canonical Representation -- vector result) and <apll>2 ⎕CR R</apll> (matrix result)
** <apl size="large">⎕DM</apl> (Diagnostic Message)
** <apll>⎕DM</apll> (Diagnostic Message)
** <apl size="large">⎕DR R</apl> and <apl size="large">L ⎕DR R</apl> (Data Representation)
** <apll>⎕DR R</apll> and <apll>L ⎕DR R</apll> (Data Representation)
** <apl size="large">⎕ERROR R</apl> (Signal Error)
** <apll>⎕ERROR R</apll> (Signal Error)
** <apl size="large">⎕SIZE R</apl> (Object Size)
** <apll>⎕SIZE R</apll> (Object Size)
** <apl size="large">⎕SYSID</apl> (System Identification)
** <apll>⎕SYSID</apll> (System Identification)
** <apl size="large">⎕SYSVER</apl> (System Version)
** <apll>⎕SYSVER</apll> (System Version)
** <apl size="large">⎕TC</apl> and other related <apl size="large">⎕TC</apl>''xxx'' (Terminal Character)
** <apll>⎕TC</apll> and other related <apll>⎕TC</apll>''xxx'' (Terminal Character)
** <apl size="large">⎕TYPE R</apl> (Object Prototype)
** <apll>⎕TYPE R</apll> (Object Prototype)
** <apl size="large">⎕UCS R</apl> (Unicode Character Set)
** <apll>⎕UCS R</apll> (Unicode Character Set)
* New Datatypes
* New Datatypes
** 2-byte Characters (Unicode, that is, UTF-16)
** 2-byte Characters (Unicode, that is, UTF-16)
** 64-bit Integers
** 64-bit Integers
** APAs (Arithmetic Progression Arrays) (e.g., <apl size="large">2 3 4⍴⍳24</apl>)
** APAs (Arithmetic Progression Arrays) (e.g., <apll>2 3 4⍴⍳24</apll>)
** ± Infinity (e.g., <apl size="large">_</apl> for infinity and <apl size="large">¯_</apl> for negative infinity) — considerable development work needs to be done to this feature to handle the many special cases
** ± Infinity (e.g., <apll>_</apll> for infinity and <apll>¯_</apll> for negative infinity) — considerable development work needs to be done to this feature to handle the many special cases


== Miscellaneous Syntax ==
== Miscellaneous Syntax ==
* Strand Assignment:  A sequence of names enclosed in parentheses can be assigned to.  For example, <apl size="large">(A B)←1 2</apl> is the same as <apl size="large">A←1</apl> followed by <apl size="large">B←2</apl>.
* Strand Assignment:  A sequence of names enclosed in parentheses can be assigned to.  For example, <apll>(A B)←1 2</apll> is the same as <apll>A←1</apll> followed by <apll>B←2</apll>.
* Modify Assignment:  An arbitrary (primitive or user-defined) dyadic function may appear immediately to the left of an assignment arrow.  For example, <apl size="large">A</apl> '''''fn'''''<apl size="large">←1</apl> is the same as <apl size="large">A←A</apl> '''''fn''''' <apl size="large">1</apl>, and <apl size="large">A[L]</apl>'''''fn'''''<apl size="large">←1</apl> is the same as <apl size="large">A[L]←A[L]</apl> '''''fn''''' <apl size="large">1</apl>.
* Modify Assignment:  An arbitrary (primitive or user-defined) dyadic function may appear immediately to the left of an assignment arrow.  For example, <apll>A</apll> '''''fn'''''<apll>←1</apll> is the same as <apll>A←A</apll> '''''fn''''' <apll>1</apll>, and <apll>A[L]</apll>'''''fn'''''<apll>←1</apll> is the same as <apll>A[L]←A[L]</apll> '''''fn''''' <apll>1</apll>.
* Modify Strand Assignment:  An arbitrary (primitive or user-defined) dyadic function may appear immediately to the left of the assignment arrow used in Strand Assignment (e.g. <apl size="large">(A B)</apl>'''''fn'''''<apl size="large">←1 2</apl> is the same as <apl size="large">A←A</apl> '''''fn''''' <apl size="large">1</apl> followed by <apl size="large">B←B</apl> '''''fn''''' <apl size="large">2</apl>).
* Modify Strand Assignment:  An arbitrary (primitive or user-defined) dyadic function may appear immediately to the left of the assignment arrow used in Strand Assignment (e.g. <apll>(A B)</apll>'''''fn'''''<apll>←1 2</apll> is the same as <apll>A←A</apll> '''''fn''''' <apll>1</apll> followed by <apll>B←B</apll> '''''fn''''' <apll>2</apll>).
* Function/operator assignment:  A primitive function, operator, or derived function may be assigned to any available name (e.g., <apl size="large">F←⍋</apl>, or <apl size="large">F←¨</apl>, or <apl size="large">F←∘</apl>, or <apl size="large">F←+.×</apl>).
* Function/operator assignment:  A primitive function, operator, or derived function may be assigned to any available name (e.g., <apll>F←⍋</apll>, or <apll>F←¨</apll>, or <apll>F←∘</apll>, or <apll>F←+.×</apll>).
* Axis operator with primitive scalar dyadic functions:  The axis operator indicates how the coordinates of the lower rank argument map to the coordinates of the higher rank argument.  For example, <apl size="large">(1 2+[1] 2 3⍴R</apl> is equivalent to <apl size="large">(⍉3 2⍴1 2)+2 3⍴R</apl>.
* Axis operator with primitive scalar dyadic functions:  The axis operator indicates how the coordinates of the lower rank argument map to the coordinates of the higher rank argument.  For example, <apll>(1 2+[1] 2 3⍴R</apll> is equivalent to <apll>(⍉3 2⍴1 2)+2 3⍴R</apll>.
* Axis operator with primitive scalar dyadic functions:  The order of the values in the axis operator brackets is significant.  For example, <apl size="large">(2 3⍴L)+[1 2] 2 3 4⍴R</apl> and <apl size="large">(⍉2 3⍴L)+[2 1] 2 3 4⍴R</apl> are identical.
* Axis operator with primitive scalar dyadic functions:  The order of the values in the axis operator brackets is significant.  For example, <apll>(2 3⍴L)+[1 2] 2 3 4⍴R</apll> and <apll>(⍉2 3⍴L)+[2 1] 2 3 4⍴R</apll> are identical.
* Axis operator with the dyadic derived function from the Each operator:  As with primitive scalar dyadic functions, the axis operator indicates how the coordinates of the lower rank argument map to the coordinates of the higher rank argument.  For example,  <apl size="large">(2 3⍴L)⍴¨[1 2] 2 3 4⍴R</apl> is equivalent to <apl size="large">(3 1 2⍉4⌿1 2 3⍴L)⍴¨2 3 4⍴R</apl>.
* Axis operator with the dyadic derived function from the Each operator:  As with primitive scalar dyadic functions, the axis operator indicates how the coordinates of the lower rank argument map to the coordinates of the higher rank argument.  For example,  <apll>(2 3⍴L)⍴¨[1 2] 2 3 4⍴R</apll> is equivalent to <apll>(3 1 2⍉4⌿1 2 3⍴L)⍴¨2 3 4⍴R</apll>.
* Axis operator to Ravel:  The order of the values in the axis operator brackets is significant, and may transpose coordinates in the right argument before mapping the values to the result.  For example, <apl size="large">,[2 1] R</apl> and <apl size="large">,[1 2] R</apl> are both valid and have the same shape and values but, in general, the values are in a different order.
* Axis operator to Ravel:  The order of the values in the axis operator brackets is significant, and may transpose coordinates in the right argument before mapping the values to the result.  For example, <apll>,[2 1] R</apll> and <apll>,[1 2] R</apll> are both valid and have the same shape and values but, in general, the values are in a different order.
* Axis operator with user-defined functions/operators:  A user-defined function/operator may be sensitive to the axis operator as are various primitive functions and operators.  For example, <apl size="large">foo[2 3] R</apl> is valid if the function header is defined as <apl size="large">∇ Z←foo[X] R</apl>.
* Axis operator with user-defined functions/operators:  A user-defined function/operator may be sensitive to the axis operator as are various primitive functions and operators.  For example, <apll>foo[2 3] R</apll> is valid if the function header is defined as <apll>∇ Z←foo[X] R</apll>.
* Axis operator values may be negative. That is, if the largest allowed value is <apl size="large">N</apl>, then the allowable range for axis operator values is <apl size="large">¯1-N</apl> to <apl size="large">N</apl>, inclusive.
* Axis operator values may be negative. That is, if the largest allowed value is <apll>N</apll>, then the allowable range for axis operator values is <apll>¯1-N</apll> to <apll>N</apll>, inclusive.
* Strand left and right arguments and result to user-defined functions/operators along with optional left argument (e.g., <apl size="large">∇ Z←FOO (R1 R2 R3 R4)</apl> or, more fully, <apl size="large">∇ (Z1 Z2)←[L1 L2 L3] (LO OP2[X] RO) (R1 R2 R3 R4)</apl>.
* Strand left and right arguments and result to user-defined functions/operators along with optional left argument (e.g., <apll>∇ Z←FOO (R1 R2 R3 R4)</apll> or, more fully, <apll>∇ (Z1 Z2)←[L1 L2 L3] (LO OP2[X] RO) (R1 R2 R3 R4)</apll>.
* Note that brackets are '''required''' to surround the left argument of an ambivalent function as in <apl size="large">∇ Z←[L] FOO R</apl> — Is this an '''inconsistent''' extension?
* Note that brackets are '''required''' to surround the left argument of an ambivalent function as in <apll>∇ Z←[L] FOO R</apll> — Is this an '''inconsistent''' extension?
* User-defined function/operator prototype line label (<apl size="large">⎕PROTOTYPE:</apl>):  When the user-defined function/operator is called to produce a prototype, this entry point is where execution of the function starts.
* User-defined function/operator prototype line label (<apll>⎕PROTOTYPE:</apll>):  When the user-defined function/operator is called to produce a prototype, this entry point is where execution of the function starts.


== System commands ==
== System commands ==
* <apl size="large">)CLOSE</apl>
* <apll>)CLOSE</apll>
* <apl size="large">)EDIT</apl>
* <apll>)EDIT</apll>
* <apl size="large">)EXIT</apl>
* <apll>)EXIT</apll>
* <apl size="large">)NEWTAB</apl>
* <apll>)NEWTAB</apll>
* <apl size="large">)RESET</apl>
* <apll>)RESET</apll>


== Session Manager ==
== Session Manager ==
* Function editor:  this feature may be invoked by typing <apl size="large">∇</apl> by itself, or <apl size="large">∇</apl> followed by a name, or <apl size="large">)EDIT</apl> by itself, or <apl size="large">)EDIT</apl> followed by a name, or by double-right-clicking on a function name in the session manager or function editor windows
* Function editor:  this feature may be invoked by typing <apll>∇</apll> by itself, or <apll>∇</apll> followed by a name, or <apll>)EDIT</apll> by itself, or <apll>)EDIT</apll> followed by a name, or by double-right-clicking on a function name in the session manager or function editor windows
* Multiple workspaces may be open at the same time and switched between via Tabs
* Multiple workspaces may be open at the same time and switched between via Tabs
* Workspaces are saved as plain text ASCII files
* Workspaces are saved as plain text ASCII files

Revision as of 17:27, 9 April 2008

The following features are considered consistent extensions to the Extended APL Standard in that they replace error-producing behavior with non-error-producing behavior. Note that Extended APL Standard wants you to know that the use of a consistent extension prevents a program from conforming with the Standard.

Language Features

  • Sink: monadic left arrow (), e.g. ←A suppresses the display of A.
  • Unified index reference, assignment, and modify assignment (R[L], R[L]←A, and R[L]fn←A): these three forms all allow both Reach and Scatter indexing — that is, if L⊃R is valid, it is equivalent to ⊃R[⊂L], and if L⌷R is valid, it is equivalent to R[⊃∘.,/L] — Reach and Scatter indexing may appear together within a single instance of R[L], R[L]←A, and R[L]fn←A.
  • Dyadic operator jot () (composition) is used to join two functions or a function and a variable to produce a derived function (e.g., ,∘⍋∘⍋∘,) which is applied as a single function. For example, the function *∘2 when applied monadically, squares its argument.
  • Monadic operator null (): To aid in resolving ambiguities with slash/slope as function/operator, use this operator. It passes through all functions as functions, and forces the symbols slash/slope to be functions rather than operators. For example, use /⊙/3 4 instead of //3 4.
  • Monadic iota () extended to negative indices. For example, in origin-0, ⍳¯3 returns ¯3 ¯2 ¯1.
  • Monadic iota () extended to length > 1 vector right arguments returns an array of indices whose shape is that of the right argument (via an internal magic function).
  • Dyadic iota () extended to rank > 1 left arguments returns an array of vector indices to the left argument (via an internal magic function).
  • Index reference, assignment, modify assignment, squad, and pick (R[L], R[L]←A, R[L]fn←A, L⌷R, and L⊃R) are each extended to negative values in L. That is, if the largest allowed value is N, then the allowable range for the values in L is ¯1-N to N, inclusive. For example, A, A[⍳⍴A], and A[⍳-⍴A] are all identical for any array A in either origin.
  • ± Infinity (e.g. _ for infinity and ¯_ for negative infinity) — considerable development work needs to be done to this feature to handle the many special cases.
  • Monadic and dyadic domino () — matrix inverse/divide extended to use Moore-Penrose pseudo-inverse algorithm via Singular Value Decomposition.
  • Prototypes for all primitive functions and operators.
  • Out of range numeric assignments to ⎕PP and ⎕PW are set to the value in the allowable range nearest the ceiling of the given number. For example, if ⎕PP is set to 23.7, that value is rounded down to 17, the largest value that system variable may assume.
  • New System Variables
    • ⎕FC (Format Control)
    • ⎕IC (Indeterminate Control)
  • New System Functions
    • 1 ⎕CR R (Canonical Representation -- vector result) and 2 ⎕CR R (matrix result)
    • ⎕DM (Diagnostic Message)
    • ⎕DR R and L ⎕DR R (Data Representation)
    • ⎕ERROR R (Signal Error)
    • ⎕SIZE R (Object Size)
    • ⎕SYSID (System Identification)
    • ⎕SYSVER (System Version)
    • ⎕TC and other related ⎕TCxxx (Terminal Character)
    • ⎕TYPE R (Object Prototype)
    • ⎕UCS R (Unicode Character Set)
  • New Datatypes
    • 2-byte Characters (Unicode, that is, UTF-16)
    • 64-bit Integers
    • APAs (Arithmetic Progression Arrays) (e.g., 2 3 4⍴⍳24)
    • ± Infinity (e.g., _ for infinity and ¯_ for negative infinity) — considerable development work needs to be done to this feature to handle the many special cases

Miscellaneous Syntax

  • Strand Assignment: A sequence of names enclosed in parentheses can be assigned to. For example, (A B)←1 2 is the same as A←1 followed by B←2.
  • Modify Assignment: An arbitrary (primitive or user-defined) dyadic function may appear immediately to the left of an assignment arrow. For example, A fn←1 is the same as A←A fn 1, and A[L]fn←1 is the same as A[L]←A[L] fn 1.
  • Modify Strand Assignment: An arbitrary (primitive or user-defined) dyadic function may appear immediately to the left of the assignment arrow used in Strand Assignment (e.g. (A B)fn←1 2 is the same as A←A fn 1 followed by B←B fn 2).
  • Function/operator assignment: A primitive function, operator, or derived function may be assigned to any available name (e.g., F←⍋, or F←¨, or F←∘, or F←+.×).
  • Axis operator with primitive scalar dyadic functions: The axis operator indicates how the coordinates of the lower rank argument map to the coordinates of the higher rank argument. For example, (1 2+[1] 2 3⍴R is equivalent to (⍉3 2⍴1 2)+2 3⍴R.
  • Axis operator with primitive scalar dyadic functions: The order of the values in the axis operator brackets is significant. For example, (2 3⍴L)+[1 2] 2 3 4⍴R and (⍉2 3⍴L)+[2 1] 2 3 4⍴R are identical.
  • Axis operator with the dyadic derived function from the Each operator: As with primitive scalar dyadic functions, the axis operator indicates how the coordinates of the lower rank argument map to the coordinates of the higher rank argument. For example, (2 3⍴L)⍴¨[1 2] 2 3 4⍴R is equivalent to (3 1 2⍉4⌿1 2 3⍴L)⍴¨2 3 4⍴R.
  • Axis operator to Ravel: The order of the values in the axis operator brackets is significant, and may transpose coordinates in the right argument before mapping the values to the result. For example, ,[2 1] R and ,[1 2] R are both valid and have the same shape and values but, in general, the values are in a different order.
  • Axis operator with user-defined functions/operators: A user-defined function/operator may be sensitive to the axis operator as are various primitive functions and operators. For example, foo[2 3] R is valid if the function header is defined as ∇ Z←foo[X] R.
  • Axis operator values may be negative. That is, if the largest allowed value is N, then the allowable range for axis operator values is ¯1-N to N, inclusive.
  • Strand left and right arguments and result to user-defined functions/operators along with optional left argument (e.g., ∇ Z←FOO (R1 R2 R3 R4) or, more fully, ∇ (Z1 Z2)←[L1 L2 L3] (LO OP2[X] RO) (R1 R2 R3 R4).
  • Note that brackets are required to surround the left argument of an ambivalent function as in ∇ Z←[L] FOO R — Is this an inconsistent extension?
  • User-defined function/operator prototype line label (⎕PROTOTYPE:): When the user-defined function/operator is called to produce a prototype, this entry point is where execution of the function starts.

System commands

  • )CLOSE
  • )EDIT
  • )EXIT
  • )NEWTAB
  • )RESET

Session Manager

  • Function editor: this feature may be invoked by typing by itself, or followed by a name, or )EDIT by itself, or )EDIT followed by a name, or by double-right-clicking on a function name in the session manager or function editor windows
  • Multiple workspaces may be open at the same time and switched between via Tabs
  • Workspaces are saved as plain text ASCII files
  • All variable names are two-byte characters (Unicode, that is, UTF-16)
  • Array rank and dimension limit of 64 bits
  • Multilevel Undo in function editing
  • Undo buffer saved with function for reuse on next edit