2022-10-28 00:55:25 +02:00
|
|
|
|
# Introduction to RPL
|
2022-10-20 23:34:44 +02:00
|
|
|
|
|
2022-10-27 23:32:00 +02:00
|
|
|
|
The original RPL (*Reverse Polish Lisp*) programming language was designed and
|
2022-10-20 23:34:44 +02:00
|
|
|
|
implemented by Hewlett Packard for their calculators from the mid-1980s until
|
|
|
|
|
2015 (the year the HP50g was discontinued). It is based on older calculators
|
2022-10-27 23:32:00 +02:00
|
|
|
|
that used RPN (*Reverse Polish Notation*). Whereas RPN had a limited stack size of
|
2022-10-20 23:34:44 +02:00
|
|
|
|
4, RPL has a stack size only limited by memory and also incorporates
|
2022-10-27 23:32:00 +02:00
|
|
|
|
programmatic concepts from the Lisp programming language.
|
2022-10-20 23:34:44 +02:00
|
|
|
|
|
2022-10-27 23:32:00 +02:00
|
|
|
|
The first implementation of RPL accessible by the user was on the HP28C, circa
|
|
|
|
|
1987, which had an HP Saturn processor. More recent implementations (e.g., HP49,
|
|
|
|
|
HP50g) run through a Saturn emulation layer on an ARM based processor. These
|
|
|
|
|
ARM-based HP calculators would be good targets for a long-term port of DB48X.
|
|
|
|
|
|
|
|
|
|
DB48X is a fresh implementation of RPL on ARM, initially targetting the
|
|
|
|
|
SwissMicros DM42 calculator. This has [implications on the design](#design-overview)
|
|
|
|
|
of this particular implementation of RPL.
|
|
|
|
|
|
|
|
|
|
## The RPL stack
|
|
|
|
|
|
|
|
|
|
The RPL stack can grow arbitrarily in size.
|
|
|
|
|
|
|
|
|
|
By convention, and following RPN usage, this document gives the names `X`, `Y`,
|
|
|
|
|
`Z` and `T` to the first four levels of the stack. This is used to describe the
|
|
|
|
|
operations on the stack with synthetic stack diagrams showing the state of the
|
|
|
|
|
stack before and after the operation.
|
|
|
|
|
|
|
|
|
|
For example, the addition of two objects in levels 1 and 2 with the result
|
|
|
|
|
deposited in stack level 1 can be described in synthetic form using the
|
|
|
|
|
following stack diagram:
|
|
|
|
|
|
|
|
|
|
`Y` `X` ▶ `Y+X`
|
|
|
|
|
|
2023-10-23 23:00:23 +02:00
|
|
|
|
The duplication operation `Duplicate` (`DUP`) can be described in synthetic form
|
|
|
|
|
using the following synthetic stack diagram:
|
2022-10-27 23:32:00 +02:00
|
|
|
|
|
2023-10-23 23:00:23 +02:00
|
|
|
|
`X` ▶ `X` `X`
|
2023-07-21 20:16:18 +02:00
|
|
|
|
|
2023-10-22 12:46:34 +02:00
|
|
|
|
|
2023-10-23 23:00:23 +02:00
|
|
|
|
## Algebraic mode
|
2023-10-22 12:46:34 +02:00
|
|
|
|
|
2023-10-23 23:00:23 +02:00
|
|
|
|
Unlike earlier RPN calculators from Hewlett-Packard, RPL calculators from HP
|
|
|
|
|
includes complete support for algebraic objects written using the standard
|
|
|
|
|
precedence rules in mathematics. This gives you the best of both worlds,
|
|
|
|
|
i.e. the keyboard efficiency of RPN, requiring less keystrokes for a given
|
|
|
|
|
operation, as well as the mathematical readability of the algebraic
|
|
|
|
|
notation. Better yet, it is possible and easy to build an algebraic expression
|
|
|
|
|
from RPN keystrokes. These nice properties are also true for DB48X.
|
|
|
|
|
|
|
|
|
|
In RPL, algebraic expressions are placed between ticks. For
|
|
|
|
|
example, `'2+3×5'` will evaluate as `17`: the multiplication `3×5`, giving `15`,
|
|
|
|
|
is performed before the addition `2+15`, which gives `17`. An algebraic
|
|
|
|
|
expression can also be symbolic and contain unevaluated variables. For example,
|
|
|
|
|
`2+x` is a valid algebraic operation. If, having this expression on the stack,
|
|
|
|
|
you type `3` and then hit the `×` key, you will end up with `(2+x)×3`, showing
|
|
|
|
|
how the algebraic expression was built from RPN keystrokes.
|
2023-10-22 12:46:34 +02:00
|
|
|
|
|
2023-10-23 23:00:23 +02:00
|
|
|
|
Algebraic expressions are not evaluated automatically. The _R/S_ key (bound to
|
|
|
|
|
the [Evaluate](#evaluate) function) will compute their value as needed. On the
|
|
|
|
|
DB48X keyboard overlay, this key is also marked as `=` for that reason.
|
|
|
|
|
|
|
|
|
|
## Rich data types
|
|
|
|
|
|
|
|
|
|
Since introducing the first scientific pocket calculator, the HP-35, in 1972,
|
|
|
|
|
and with it the reverse polish notation (RPN), Hewlett-Packard perfected its
|
|
|
|
|
line-up for decades. This led to such powerhouses pocket computers such as as
|
|
|
|
|
the HP-41C series, or tiny wonders of pocket efficiency such as the HP-15C. Many
|
|
|
|
|
of these calculators, including the models we just cited, were capable of
|
|
|
|
|
advanced mathematics, including dealing with complex numbers, matrix operations,
|
|
|
|
|
root finding or numeric integration.
|
|
|
|
|
|
|
|
|
|
Then in 1986, everything changed with the HP-28C, which introduced a new user
|
|
|
|
|
interface called RPL. While the most evidently visible change was an unlimited
|
|
|
|
|
stack, what instantly made it both more powerful and easier to use than all its
|
|
|
|
|
RPN predecessors was the introduction of [data types](#types). Every value
|
|
|
|
|
on the stack, instead of having to be a number, could be a text, a name or an
|
|
|
|
|
equation. This made operations completely uniform irrespective of the data being
|
|
|
|
|
operated on. The same `+` operation that adds numbers can also add complex
|
|
|
|
|
numbers, vectors, matrices, or concatenate text. The exact same logic applies in
|
|
|
|
|
all case. This solved a decade-long struggle to extend the capabilities of
|
|
|
|
|
pocket calculators.
|
|
|
|
|
|
|
|
|
|
For example, whereas the HP-41C had some support for text, with an "Alpha" mode
|
|
|
|
|
and an alpha register, text operations were following their own logic, with for
|
|
|
|
|
example `ARCL` and `ASTO` dealing with at most 6 characters at a time, because
|
|
|
|
|
they were artificially fitted in a register designed to hold a numerical value.
|
|
|
|
|
Dealing with complex numbers on the HP-41C was
|
|
|
|
|
[similarly clunky](https://coertvonk.com/sw/hp41/complex-arithmetic-xmem-4426).
|
|
|
|
|
Even the HP-15C, which had built-in support for complex numbers, remained a bit
|
|
|
|
|
awkward to use in "complex mode" because its display could only show one half of
|
|
|
|
|
a complex number, e.g. the real or imaginary part. Similarly, matrix or
|
|
|
|
|
statistic operations had non-obvious interactions with numbered data registers.
|
|
|
|
|
|
|
|
|
|
All this was solved with RPL, because now a complex number, a matrix or a text
|
|
|
|
|
would occupy a single entry on the stack. So whereas adding two integers would
|
|
|
|
|
require a sequence like `1 ENTER 2 +` like in RPN, a very similar sequence would
|
|
|
|
|
add two texts: `"ABC" ENTER "DEF" +`, and the exact same logic would also add
|
|
|
|
|
two vectors in `[1 2 3] ENTER [4 5 6] +`.
|
|
|
|
|
|
|
|
|
|
DB48X adopts this extremely powerful idea, with a focus on making it as
|
|
|
|
|
efficient as possible for interactive calculations as well as for custom
|
|
|
|
|
programmed solution.
|