: +field ( n "name" -- ) create over , + does> ( addr -- addr' ) @ + ; : field: ( "name" -- ) aligned 1 cells +field ; \ add n1 to the value at addr, returning the original value. : increment ( n1 addr -- n2 ) tuck @ tuck + rot ! ; 0 field: wav-inc field: wav-val 2 cells +field wav-bounds drop : flip ( wav -- ) wav-inc dup @ negate swap ! ; : edge? ( wav -- flag ) dup wav-val @ swap wav-bounds 2@ within 0= ; : tri-wave ( min max inc -- ) create abs negate , over , , 1+ , does> ( -- cur ) dup edge? if dup flip then dup wav-inc @ swap wav-val 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