|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
\ ==============================================================================
\
\ RubyFORTH -- Copyright (C) 2007-8, Marc Simpson (GPL).
\
\ This file contains Forth code demonstrating parts of RubyFORTH.
\
\ ==============================================================================
\ --[ Generic Words ]-----------------------------------------------------------
: .a cr ." a" ;
: .b cr ." b" ;
: .c cr ." c" ;
\ --[ Looping tests ]-----------------------------------------------------------
: go1 10 0 do cr ." ==> Step..." loop ;
: go2 10 0 do cr ." ==> Step: " i . loop ;
\ --[ Conditional Tests ]-------------------------------------------------------
: go3 if .a else .b then .c ;
\ --[ Mixed tests ]-------------------------------------------------------------
: go4 10 0 do i 2 / go3 loop ;
\ --[ Recursion ]---------------------------------------------------------------
( We have no need for a RECURSE word since : writes its header immediately... )
: factorial ( n -- ) dup 1 > if dup 1- factorial * then ;
( Note that in Forths with RECURSE, we can do the following: )
( )
( : test ." hello" ; )
( : test test space ." world" ; )
( )
( When test is run, 'hello world' prints. Our model is different, requiring: )
( )
( : test ." hello" ; )
( ' test : test [ , ] space ." world" ; )
( )
( Equally, we could create an alias for the older word which we're seeking to )
( overwrite; )
( )
( : test ." hello" ; )
( alias old-test test )
( : test old-test space ." world" ; )
\ --[ Deferral ]----------------------------------------------------------------
defer .greeting
: .formal ." Good day, sir." ;
: .friendly ." Hey man." ;
: formal ['] .formal [is] .greeting ;
: friendly ['] .friendly [is] .greeting ;
\ --[ Aliasing ]----------------------------------------------------------------
( Create shorthands for our context-switching words )
alias comp compiler
alias terp forth
\ --[ Files ]-------------------------------------------------------------------
: open: open constant ;
: .file ( fd -- )
>r r@ 0 seek
begin r@ eof? not while r@ readline type repeat r> drop ;
( " README" r/o open: readme )
( readme .file )
\ --[ Primitives ]--------------------------------------------------------------
( We can create new Forth words that execute Ruby code by using 'prim' )
prim pwd push(Dir.pwd)
: .pwd pwd . ;
( .pwd )
prim (ls) system("ls " + pop)
: ls 0 parse (ls) ;
( ls -l )
\ ------------------------------------------------------------------------------