~ This is a temporary holding place for stuff that probably should be in ~ core someday, but only after carefully considering whether to rewrite it in ~ assembly. Most of it originally came from boot_source in quine.asm. ~ Now some fancier stack combinators. ~ ~ While it might be nice, for performance reasons, to do these in ~ assembler, for now it's more important to have them at all. : 1- 1 - ; : 1+ 1 + ; : max 2dup >= { swap drop } { drop } if-else ; : min 2dup <= { swap drop } { drop } if-else ; : over swap dup 3unroll ; : pick 2 + dup roll dup 3roll unroll ; ~ Standard Forth doesn't have equivalents of our ndrop and ndup. The HP ~ calls them DROPN and DUPN but that doesn't go well with ie. 2dup or 3roll, ~ so we do it like this. : ndrop { dup } { swap drop 1- } while drop ; : ndup dup 1+ swap { dup } { swap dup pick 3unroll swap 1- } while 2drop ; : 3drop drop drop drop ; : 3dup 2 pick 2 pick 2 pick ; : && 0 != swap 0 != * ; : || | 0 != ; : not 0 = ; : negate -1 * ; : align-floor dup 3unroll /% swap drop * ;