decimal \ Neighborhood address lines 12 constant /address-lines create address-lines /address-lines 10 + allot variable address-value : address-line ( line --- addr ) address-lines + ; : address-line@ ( line --- b ) address-line c@ if 1 else 0 then ; : address-line! ( b line --- ) swap if 1 else 0 then swap address-line c! ; : clear-address-lines address-lines /address-lines erase ; clear-address-lines : set-address-lines ( n --- ) dup address-value ! /address-lines 0 do dup 1 and i address-line! 2/ loop drop ; \ Associate a name with an address line : == ( n --- ) \ name create , does> @ address-line@ ; \ Major neighborhoods: \ n/moore n/vonn n/marg n/marg-ph n/marg-hv 0 == center 1 == center' 2 == s.east 2 == east' 2 == cw 3 == s.west 3 == west' 3 == ccw 4 == n.east 4 == south' 4 == opp 5 == n.west 5 == north' 5 == cw' 6 == east 6 == ccw' 7 == west 7 == opp' 8 == south 8 == phase 8 == horz 9 == north 9 == phase' 9 == vert \ Minor neighborhoods: \ &/centers &/phases &/hv 10 == ¢er 10 == &phase 10 == &horz 11 == ¢er' 11 == &phase' 11 == &vert \ Higher level neighborhood stuff : centers ( --- n ) center center' 2* + ; : norths ( --- n ) north north' 2* + ; : souths ( --- n ) south south' 2* + ; : easts ( --- n ) east east' 2* + ; : wests ( --- n ) west west' 2* + ; : ¢ers ( --- n ) ¢er ¢er' 2* + ; : &phases ( --- n ) ¢ers ; : cws cw cw' 2* + ; : ccws ccw ccw' 2* + ; : opps opp opp' 2* + ; : u center ; \ Rule table : 2^x ( x --- 2^x ) 1 swap 0 ?do 2* loop ; /address-lines 2^x constant /rule-table create rule-table /rule-table 10 + allot : table-index address-value @ ; : table@ ( index --- b ) rule-table + c@ ; : table! ( b --- ) rule-table + c! ; : clear-rule-table rule-table /rule-table erase ; clear-rule-table \ Plane manipulation : >planer ( mask shift --- ) \ name create c, c, does> ( b >body --- ) >r \ b r@ c@ << \ b< 1+ c@ not and \ bsm t&!mask or \ bsm|tm table-index table! \ ; 1 0 >planer >pln0 2 1 >planer >pln1 4 2 >planer >pln2 8 3 >planer >pln3 16 4 >planer >pln4 32 5 >planer >pln5 64 6 >planer >pln6 128 7 >planer >pln7 3 0 >planer >plna 12 2 >planer >plnb 16 4 >planer >aux0 32 5 >planer >aux1 64 6 >planer >aux2 128 7 >planer >aux3 48 4 >planer >auxa 192 6 >planer >auxb 1 0 >planer >1plane 3 0 >planer >2planes 7 0 >planer >3planes 15 0 >planer >4planes 31 0 >planer >5planes 63 0 >planer >6planes 127 0 >planer >7planes 255 0 >planer >8planes \ Rule compiler variable rule-function : compile-rule-function ( rule-function --- ) dup rule-function token! /address-lines 2^x 0 do i set-address-lines \ set neighborhood state dup execute \ execute the rule loop ; : compile-rule \ rule ' compile-rule-function ; \ Case statement : ({ ( n --- ) /token * r@ /token + /branch + + token@ execute ; : { compile ({ compile branch >mark ; immediate : } >resolve ; immediate : echo center >pln1 ; : trippy-echo center >pln1 center' >pln2 center center' xor >pln6 ; \ macros : 8sum ( --- n ) north south east west n.west n.east s.west s.east + + + + + + + ; : 9sum ( --- n ) 8sum center + ; : u \ unchanged center ;