rendered paste body: +field ( n "name" -- ) over create , +
does> ( addr -- addr' ) @ + ;
: field: ( "name" -- ) aligned 1 cells +field ;
\ set sign of value at addr.
: positive ( addr -- ) dup @ abs swap ! ;
: negative ( addr -- ) dup @ abs negate swap ! ;
\ add n1 to the value at addr, returning the original value.
: increment ( n1 addr -- n2 ) tuck @ tuck + rot ! ;
0
1 cells field: tri-cur
1 cells field: tri-inc
1 cells field: tri-max
1 cells field: tri-min
drop
: bottom? ( wav -- flag ) dup tri-cur @ swap tri-min @ <= ;
: top? ( wav -- flag ) dup tri-cur @ swap tri-max @ >= ;
: tri-wave ( min max inc -- ) create 1 , , , ,
does> ( -- cur )
dup bottom? if dup tri-inc positive then
dup top? if dup tri-inc negative then
dup tri-inc @ swap tri-cur increment
;
1 4 1 tri-wave a-wave
\ generates a series: 1 2 3 4 3 2 1 2 3...
\ with repeated calls to a-wave
a-wave .
a-wave .
a-wave .
a-wave .
a-wave .
a-wave .
a-wave .
a-wave .
a-wave .
a-wave .
a-wave .
a-wave .
cr bye