--- title: RPNCalc v4 slug: rpncalc4 description: Reverse Polish Notation calculator, version 4 - increasingly esoteric and incomprehensible. Contributed by Aidan. ---
use (name; value)
to define something. the definition can be recursive. value
is executed and name
is set to the final state of the stack, i.e. (name; 1 3)
is possible
use '
to push instead of apply to the stack, e.g. '(a -> a)
. This is useful for lazyness, i.e. '(->lazy evaluated thing)
+, -, *, /, ^, sqrt
: mathematical operations==
: equality (automatically derived for all types); returns a b -> a
if true, a b -> b
if falsetypeof
: returns the type of the objectpair, fst, snd
: pairs two objects, gets first or second item of pairtuple
: used like ... 3 tuple
; creates an n tuple of n items on the stack!!
: index into a tuplelen
: length of a tuplestop; "stop
inv; x -> 1 x /
fold; x acc fn -> acc '(-> x acc fn 'fn fold) 'x \"stop ==
range; x y -> x '(->x x 1 + y range) 'x y ==
listthen; fn -> (internal; x acc -> '(->acc fn) '(->x acc pair internal) x stop ==) 0 tuple internal
list; (a -> a) listthen
lmap; list fn -> list '(->list fst fn list snd 'fn lmap pair) list 0 tuple ==
unlist; l -> (internal; list -> '(->) '(->list fst list snd internal) list 0 tuple ==) stop l internal
map; fn -> '(l->l 'fn lmap unlist) listthen