blob: d32381656c2a48c0f54abf2d288c3ed3e2019663 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
~ 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 * ;
|