mirror of
https://github.com/louisrubet/rpn
synced 2025-02-01 07:57:52 +01:00
142 lines
3.6 KiB
Markdown
142 lines
3.6 KiB
Markdown
# **rpn** - **R**everse **P**olish **N**otation CLI calculator [![License: LGPLv3](https://www.gnu.org/graphics/lgplv3-88x31.png)](https://www.gnu.org/licenses/lgpl-3.0.en.html)
|
|
|
|
### A math functional language using reverse (postfix) polish notation
|
|
|
|
```rpn
|
|
rpn> 1 2 +
|
|
3
|
|
rpn> 2 sqrt
|
|
2> 3
|
|
1> 1.4142135623730950488016887242096980786
|
|
```
|
|
|
|
### Manipulating reals, complexes, strings, symbols on a stack
|
|
|
|
```rpn
|
|
rpn> 1 2 + 2
|
|
2> 3
|
|
1> 2
|
|
rpn> r->c sq conj (1,1) /
|
|
(-3.5,-8.5)
|
|
```
|
|
|
|
```rpn
|
|
rpn> 0x1234 dec
|
|
4660
|
|
rpn> bin
|
|
0b1001000110100
|
|
```
|
|
|
|
```rpn
|
|
rpn> 4 fix "sqrt of 2 is about " 2 sqrt ->str +
|
|
"sqrt of 2 is about 1.4142"
|
|
```
|
|
|
|
```rpn
|
|
rpn> << -> x << x 3 ^ 2 x * - 3 + >> >> 'f' sto
|
|
rpn> 2 f
|
|
7
|
|
rpn> (1,2) f
|
|
(-10,-6)
|
|
```
|
|
|
|
### Arbitrary precision
|
|
|
|
```rpn
|
|
rpn> 256 prec
|
|
rpn> pi
|
|
3.1415926535897932384626433832795028841971693993751058209749445923078164062862
|
|
rpn>
|
|
```
|
|
|
|
### Variables, structured programming
|
|
|
|
```rpn
|
|
rpn> 0 1 10000 for i i sq + next
|
|
333383335000
|
|
```
|
|
|
|
```rpn
|
|
rpn> a 1 > if then a sq 'calc' eval else 'stop' eval end
|
|
```
|
|
|
|
```rpn
|
|
rpn> << dup
|
|
> 1 > if then
|
|
> dup 1 - fibo swap 2 - fibo +
|
|
> else
|
|
> 1 == 1 0 ifte
|
|
> end >>
|
|
>'fibo' sto
|
|
rpn> 12 fibo
|
|
144
|
|
```
|
|
|
|
### Available functions
|
|
|
|
```rpn
|
|
rpn>
|
|
Display all 145 possibilities? (y or n)
|
|
help sqrt arg <= depth ift -> log2
|
|
h sq c->r != roll ifte pi alog2
|
|
? abs r->c == rolld do sin exp2
|
|
quit sign p->r and over until asin sinh
|
|
q % r->p or ->str while cos asinh
|
|
exit %CH std xor str-> repeat acos cosh
|
|
test mod fix not chr sto tan acosh
|
|
version fact sci same num rcl atan tanh
|
|
uname mant prec swap size purge d->r atanh
|
|
history xpon round drop pos vars r->d time
|
|
+ floor default drop2 sub clusr e date
|
|
- ceil type dropn if edit ln ticks
|
|
* ip hex del then sto+ log
|
|
/ fp dec erase else sto- lnp1
|
|
inv min bin rot end sto* exp
|
|
chs max base dup start sto/ expm
|
|
neg re > dup2 for sneg log10
|
|
^ im >= dupn next sinv alog10
|
|
pow conj < pick step eval exp10
|
|
```
|
|
|
|
## Download
|
|
|
|
Available as source code and flatpak under [flathub](https://flathub.org/apps/category/Science) (_coming soon_).
|
|
|
|
## Manual
|
|
|
|
A reference manual is provided [here](MANUAL.md)
|
|
|
|
## Generation
|
|
|
|
rpn is written in C++ and is dynamically linked to GNU MP and GNU MPFR.
|
|
It integrates [linenoise-ng](https://github.com/louisrubet/linenoise-ng.git) and [mpreal](http://www.holoborodko.com/pavel/mpfr/) source code as git submodules.
|
|
|
|
It can be generated following the steps below:
|
|
|
|
## Generate and install under Ubuntu 20.04 LTS and superior
|
|
|
|
```shell
|
|
sudo apt install git cmake g++ libmpfr6 libmpfr-dev
|
|
git clone https://github.com/louisrubet/rpn/
|
|
mkdir -p rpn/build && cd rpn/build
|
|
cmake ..
|
|
make -j
|
|
sudo make install
|
|
```
|
|
|
|
## Generate and install under Fedora 35
|
|
|
|
```shell
|
|
sudo dnf install git cmake g++ mpfr mpfr-devel
|
|
git clone https://github.com/louisrubet/rpn/
|
|
mkdir -p rpn/build && cd rpn/build
|
|
cmake ..
|
|
make -j
|
|
sudo make install
|
|
```
|
|
|
|
## Contact, contribution, bug report
|
|
|
|
Please email me at [louis@rubet.fr](mailto:louis@rubet.fr)
|
|
|
|
You can also use [github issues](https://github.com/louisrubet/rpn/issues) and [pull requests](https://github.com/louisrubet/rpn/pulls)
|