Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
\ ============================================================================== \ \ RubyFORTH -- Copyright (C) 2007-8, Marc Simpson (GPL). \ \ Core definitions (written in Forth for expository purposes) \ \ ============================================================================== \ --[ FORTH words ]------------------------------------------------------------- : char ( "char" -- c ) bl parse 0 i@ ; : ." ( "...["]" -- ) 34 parse type ; : +! ( n addr -- ) tuck @ + swap ! ; : 0= ( n -- f ) 0 = ; : not ( n -- f ) 0 = ; : 0<> ( n -- f ) 0= not ; : defer ( "name" -- ) create 0 , does> @ execute ; : is ( xt "name" ) ' 3 + ! ; : 2! ( n1 n2 a -- ) tuck 1+ ! ! ; : 2@ ( a -- n1 n2 ) dup @ swap 1+ @ ; : 2, ( n1 n2 -- ) swap , , ; : -rot ( a b c -- c a b ) rot rot ; : <= ( n1 n2 -- f ) 2dup < -rot = or ; : >= ( n1 n2 -- f ) swap <= ; \ --[ COMPILER words ]---------------------------------------------------------- compiler : [compile] ' , ; : ['] ' [compile] literal ; : 2literal swap [compile] literal [compile] literal ; : char bl parse 0 i@ [compile] literal ; : 2>r compile >r compile >r ; : 2r> compile r> compile r> ; : 2r@ [compile] 2r> compile 2dup [compile] 2>r ; : [is] ' 3 + [compile] literal compile ! ; : i compile r@ ; : ." [compile] " compile type ; ( Conditionals -- standard method, cf. eforth ) : if compile ?branch here 0 , ; : then here swap ! ; : ahead compile branch here 0 , ; : else [compile] ahead swap [compile] then ; ( Loops ) : dobranch? [compile] 2r@ compile < compile ?branch ; : 2rdrop [compile] 2r> compile 2drop ; : iterate compile r> compile 1+ compile >r ; : do compile swap [compile] 2>r here 0 , [compile] dobranch? here 0 , ; : loop [compile] iterate compile branch swap , here swap ! [compile] 2rdrop ; : for 0 [compile] literal [compile] do ; : next [compile] loop ; ( Quit the loop upon next iteration -- best used with a conditional ) : unloop compile r> compile drop compile r@ compile >r ; : begin here ; : while compile ?branch here swap 0 , ; ( w-addr b-addr ) : again compile branch , ; : repeat [compile] again here swap ! ; \ --[ Additional Utilities ]---------------------------------------------------- forth : ?dup dup 0<> if dup then ; : max ( n1 n2 -- n3 ) 2dup > if drop else nip then ; : min ( n1 n2 -- n3 ) 2dup < if drop else nip then ; compiler ( Conditionally preserve the TOS if it's true, then enter a conditional ) : ?if compile ?dup [compile] if ; forth : r/w " r+" ; : w/r " w+" ; : r/o " r" ; : w/o " w" ; \ --[ RubyFORTH banner ]-------------------------------------------------------- defer .banner : .default-banner cr ." --------------------------------------------------------" cr space ." RubyFORTH -- Copyright (C) 2007-8, Marc Simpson (GPL). " cr ." --------------------------------------------------------" cr cr ; ' .default-banner is .banner \ --[ Vocabularies ]------------------------------------------------------------ : vocab: ( "name" -- ) parse-word dup vocab swap ( <vocab> "name" -- ) make , does> @ ; ( Leave the interpreter in FORTH mode. ) ( DONE )