Versions 1.3.5 and higher, also feature significant language additions.

We call the combination of traditional RPL with those additional features "RPL+" (http://naivedesign.com/ND1/ND1_Reference__RPL+.html).

These features are (or will be, for those marked "next update" or "planned"):

. operator:

- Code: Select all
`folder.program`

Local variables improvements

fused = operator for defining/assigning, and re-defining/re-assigning at any time, a local variable:

- Code: Select all
`=x`

- Code: Select all
`→ x ≪ ... ≫`

- Code: Select all
`'x' STO`

fused =: operator working like = but not consuming the top-of-stack item:

- Code: Select all
`=:x`

- Code: Select all
`→ x ≪ x ... ≫`

- Code: Select all
`'x' STO x`

fused =+, =*, =-, =/ operators for adding to, multiplying, subtracting, dividing, respectively, a local variable:

- Code: Select all
`=+x`

- Code: Select all
`'x' STO+`

fused [] operator for one- and zero-based array read access:

- Code: Select all
`x[expr]`

- Code: Select all
`'x' [commands to implement expr] GET or the equivalent 'x(expr)' EVAL`

For example, for expr := j-k

- Code: Select all
`x[j-k]`

- Code: Select all
`'x' j k - GET or the equivalent 'x(j-k)' EVAL`

- Code: Select all
`x[j-k:0]`

- Code: Select all
`'x' j k - 1 + GET or the equivalent 'x(j-k+1)' EVAL`

Indexes wrap, permitting circular buffers (unless a system flag is set to prevent this behavior).

For (j-k) > length of array x:

- Code: Select all
`x[j-k]`

- Code: Select all
`'x' j k - x SIZE LIST→ MOD 1 + GET or the equivalent 'x(MOD(j-k, [sizeOfX])+1)' EVAL`

fused =local[] operator for one- and zero-based array write access:

- Code: Select all
`=x[expr]`

- Code: Select all
`'x' [commands to implement expr] PUT or the equivalent 'x(expr)' STO`

For example, for expr := j-k

- Code: Select all
`=x[j-k]`

- Code: Select all
`'x' j k - PUT or the equivalent 'x(j-k)' STO`

- Code: Select all
`=x[j-k:0]`

- Code: Select all
`'x' j k - 1 + PUT or the equivalent 'x(j-k+1)' STO`

For indices j > length of array x, an error is thrown, except the element following the last can be assigned.

E.g., for x := [1 2 3]

- Code: Select all
`=x[4]`

- Code: Select all
`'x' SWAP +`

fused =:local[] operator for zero-based array write access, without consuming top-of-stack item:

- Code: Select all
`=:x[j-k]`

- Code: Select all
`DUP 'x' j k - PUT or the equivalent DUP 'x(j-k)' STO`

and

- Code: Select all
`=:x[j-k:0]`

- Code: Select all
`DUP 'x' j k - 1 + PUT or the equivalent DUP 'x(j-k+1)' STO`

and, for j == length of array x:

- Code: Select all
`=:x[j]`

- Code: Select all
`DUP 'x' SWAP +`

fused [] operator for one- and zero-based string read access:

- Code: Select all
`x[expr]`

- Code: Select all
`'x' commands-to-implement-expr DUP SUB`

For example, for expr j-k

- Code: Select all
`x[j-k]`

- Code: Select all
`'x' j k - DUP SUB`

- Code: Select all
`x[j-k:0]`

- Code: Select all
`'x' j k - 1 + DUP SUB`

fused ++ and -- operators:

- Code: Select all
`++x`

- Code: Select all
`'x' 1. STO+ or 'x' 1 STO+`

stand-alone ++ and -- operators:

- Code: Select all
`++`

- Code: Select all
`1. + or 1 +`

"Default to zero-based indexing" command:

- Code: Select all
`0[]`

"Permit hash table indexing" command:

- Code: Select all
`any[]`

extended scope of local variables: inner-frame (called) RPL code has access to the local variables of outer-frame (calling) RPL code. Inner frame local variable definitions supersede outer frame variables of the same name

BREAK, CONTINUE and IFTB, IFTC for early termination/continuation in loops. x IFTB and x IFTC are shortcuts for IF x THEN BREAK END and IF x THEN CONTINUE END, respectively.

Immediate algebraic expressions: algebraic expressions may appear without '' (single quote) type decorators, for immediate evaluation. They must not contain white space characters.

- Code: Select all
`expr`

- Code: Select all
`'expr' EVAL`

(planned) optional typing of local variables:

- Code: Select all
`→ x:real v:vector ≪ ...`

- Code: Select all
`=x:real =v:vector`

- Code: Select all
`→ x v ≪ ...`

Array (list, vector) improvements

- parallel processing extended to vectors: list processing commands, and automatic list processing, is available for vectors

- new "language-close" commands: insert, remove, (planned)push, (planned)pop, and more (see http://naivedesign.com/ND1/ND1_Reference__Function_Summary.html)

- nonEmptyResult variable: DOSUBS and DOLIST set a new global variable, which indicates whether or not their operation yielded new items on the stack

There are other RPL-related features in MorphEngine.

For example, RPL can call JavaScript. This is a strong feature by itself, but we're not considering this a language feature, as it has no bearings on the syntax. So this is not considered part of RPL+.

Similarly, there's a growing number of MorphEngine-specific (i.e., non-HP) commands and data types (such as the image data type and associated functions). These augment what you can do in RPL, but, too, are not language features per se, and therefore not listed here.

This post will be updated with new or planned RPL+ features, as they become available.

If there're language-level improvements you'd like to see in RPL, or if you see a reason not to implement a planned feature, please reply with your suggestions. Thank you for your input.