#!/bin/rc . /bin/maths.rc ramfs -m /n/words stack = () return = () nl = ' ' spacetabnl = ' ' fn do { switch($1) { case dup # (a -- a a) stack = ($stack(1) $stack) case swp # (a b -- b a) stack = ($stack(2) $stack(1) $stack(3-)) case drop # (a --) stack = ($stack(2-)) case emit # (a --) echo -n $stack(1) | tr $nl | tr ¯ ' ' stack = ($stack(2-)) case eval # (a b (a items) --) eval $stack(2-`{add 2 $stack(1)}) top = `{add 3 $stack(1)} stack = ($stack($top-)) case 'eval<' # (a b (a items) -- (eval output) ) top = `{add 3 $stack(1)} stack = (`{eval $stack(2-`{add 2 $stack(1)})} $stack($top-)) case ~ i = 2 while(test $i -lt $#stack || test $i -eq $#stack && ! ~ $stack($i) $stack(1)) i = `{inc $i} if(test $i -gt $#stack) stack = (0 $stack(2-)) if not { stack = (`{sub $i 1 } $stack(2-)) } case stk echo $"stack case * if(test -e /n/words/$1) { # recurse ifs = $spacetabnl for(w in `{cat /n/words/$1}) do $w ifs = $nl } if not # (a -- $1 a) stack = ($1 $stack) } } ifs = $nl if(~ $1 -i) echo -n '> ' while(line=`{read}) { ifs = $spacetabnl words = `{echo -n $line} ifs = $nl switch($words(1)) { case : echo $words(3-) > /n/words/$words(2) case * for(w in $words) do $w } if(~ $1 -i) echo -n '> ' }