| 'DOCUMENTATION' | ~~ the @reduce library allows you to reduce RPN expressions that are enclosed within curly braces inside of a tuple . here's an example of how to use it : '' (@reduce snake = x is { 2 3 + 4 * } and y is { 10 7 - } .) this will result in the following : 'snake' x is 20 and y is 3 also note that you can replace the stack name with @main to push the result to the main stack . | '' (@reduce .) | '' convert output stack to tuple | '' @reduce? '' ($stack =) | 'destination' $stack | '' @reduce? '' ({ }) 'numbers' $result | 'output' $result | '' @reduce? '' {? '' + 'numbers' ($b $a) | '@js' f("numbers", "" + (Number($a) + Number($b))); | '' @reduce? '' {? '' - 'numbers' ($b $a) | '@js' f("numbers", "" + (Number($a) - Number($b))); | '' @reduce? '' {? '' * 'numbers' ($b $a) | '@js' f("numbers", "" + (Number($a) * Number($b))); | '' @reduce? '' {? '' / 'numbers' ($b $a) | '@js' f("numbers", "" + (Number($a) / Number($b))); | '' @reduce? '' {? '' random 'numbers' ($max $min) | '@js' const min = Number($min), max = Number($max); f("numbers", min + Math.floor(Math.random() * (max - min))); | '' @reduce? '' {? '' wrap 'numbers' ($max $min $a) | '@js' const a = Number($a), min = Number($min), max = Number($max); let result = a; if (a < min) result = max; if (a > max) result = min; f("numbers", result); | '' @reduce? '' {? '' $number| 'numbers' $number | '' @reduce? '' $word | 'output' $word | '' convert $stack stack to tuple 'destination' $destination | '@js' let destination = $destination == "@main" ? "" : $destination; f(destination, ...stacks[$stack].map(fact => fact.join(" "))); delete stacks[$stack];