Consistent Extensions in NARS2000: Difference between revisions
From NARS2000
Jump to navigationJump to search
Sudleyplace (talk | contribs) |
Sudleyplace (talk | contribs) No edit summary |
||
Line 3: | Line 3: | ||
== Language Features == | == Language Features == | ||
* Sink: monadic left arrow (<apll>←</apll>), e.g. <apll>←A</apll> suppresses the display of <apll>A</apll>. | * 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 (<apll>R[L]</apll>, <apll>R[L]←A</apll>, and <apll>R[L]< | * Unified index reference, assignment, and modify assignment (<apll>R[L]</apll>, <apll>R[L]←A</apll>, and <apll>R[L]<i>f</i>←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]<i>f</i>←A</apll>. | ||
* 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. | * 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 (<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 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>. | ||
Line 9: | Line 9: | ||
* 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). | * 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 (<apll>⍳</apll>) 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 (<apll>R[L]</apll>, <apll>R[L]←A</apll>, <apll>R[L]< | * Index reference, assignment, modify assignment, squad, and pick (<apll>R[L]</apll>, <apll>R[L]←A</apll>, <apll>R[L]<i>f</i>←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 ¯1[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. <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. | * ± 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 (<apll>⌹</apll>) — 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. | ||
Line 36: | Line 36: | ||
== Miscellaneous Syntax == | == Miscellaneous Syntax == | ||
* 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>. | * 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, <apll>A< | * Modify Assignment: An arbitrary (primitive or user-defined) dyadic function may appear immediately to the left of an assignment arrow. For example, <apll>A<i>f</i>←1</apll> is the same as <apll>A←A<i>f</i> 1</apll>, and <apll>A[L]<i>f</i>←1</apll> is the same as <apll>A[L]←A[L]<i>f</i> 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. <apll>(A B)< | * 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)<i>f</i>←1 2</apll> is the same as <apll>A←A<i>f</i> 1</apll> followed by <apll>B←B<i>f</i> 2</apll>). | ||
* 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>). | * 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, <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 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>. | ||
Line 44: | Line 44: | ||
* 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 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, <apll>FOO[2 3] R</apll> is valid if the function header is defined as <apll>∇ Z←FOO[X] R</apll>. | * 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 <apll>N</apll>, then the allowable range for axis operator values is <apll>¯1-N</apll> to <apll>N</apll>, 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 ¯1[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., <apll>∇ Z←FOO (R<sub>1</sub> R<sub>2</sub> R<sub>3</sub> R<sub>4</sub>)</apll> or, more fully, <apll>∇ (Z<sub>1</sub> Z<sub>2</sub>)←{L<sub>1</sub> L<sub>2</sub> L<sub>3</sub>} (LO OP2[X] RO) (R<sub>1</sub> R<sub>2</sub> R<sub>3</sub> R<sub>4</sub>)</apll>. | * Strand left and right arguments and result to user-defined functions/operators along with optional left argument (e.g., <apll>∇ Z←FOO (R<sub>1</sub> R<sub>2</sub> R<sub>3</sub> R<sub>4</sub>)</apll> or, more fully, <apll>∇ (Z<sub>1</sub> Z<sub>2</sub>)←{L<sub>1</sub> L<sub>2</sub> L<sub>3</sub>} (LO OP2[X] RO) (R<sub>1</sub> R<sub>2</sub> R<sub>3</sub> R<sub>4</sub>)</apll>. | ||
* Note that braces are '''required''' to surround the left argument of an ambivalent function as in <apll>∇ Z←{L} FOO R</apll> — Is this an '''inconsistent''' extension? | * Note that braces are '''required''' to surround the left argument of an ambivalent function as in <apll>∇ Z←{L} FOO R</apll> — Is this an '''inconsistent''' extension? |
Revision as of 11:46, 10 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]f←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]f←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]f←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 ¯1[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, Af←1 is the same as A←Af 1, and A[L]f←1 is the same as A[L]←A[L]f 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)f←1 2 is the same as A←Af 1 followed by B←Bf 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 ¯1[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 braces 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