--- 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, cbrt, exp, log, (a)cos/sin/tan, abs, floor: 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; "stopinv; 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 internallist; (a -> a) listthenlmap; 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 internalmap; fn -> '(l->l 'fn lmap unlist) listthen